關於分布式事務的實現,網上有很多解說,當然這也是面試官的常備面試題。很多朋友在工作中很少接觸到分布式事務,認為這個玩意互動太多,沒必要。其實我也是這麼想的,想要完成乙個完整的分布式事務鏈路,通訊開銷實在太多。而現如今,微服務架構在行業內大行其道,恨不得所有模組都用上微服務來管理,而不知道自己已經慢慢失去了對軟體控制的能力,從資料層面上來說,我們降低了對資料一致性控制的能力。既然市場上很流行,我們還是需要了解一下的,藉此,本文介紹一下基於訊息中介軟體的分布式事務的原理。
了解分布式事務,我們需要抓住幾個重點。我總結了一下,可以稱之為232法則,即兩個角色,三個階段,兩個結果。兩個角色是指系統中要存在協調者角色和參與者角色,本文中訊息伺服器充當協調者,客戶端和服務端充當參與者;三個階段是指分布式事務可以分為預提交階段,提交階段,撤銷階段。兩個結果是指,參與者中的執行操作要麼全部執行,要麼全部失敗,不能出現部分成功部分失敗的情況。
基於訊息伺服器的分布式事務,我們需要將事務劃分成兩個部分,乙個是客戶端與訊息伺服器互動的提交部分,乙個是服務端與訊息伺服器互動的消費部分。我們需要保證兩點:
1、確保客戶端處理完業務後一定能成功傳送訊息。
2、確保服務端一定能夠消費掉此訊息。
剩下的就看我們如何在互動上完成這兩個目標。
客戶端提交大概可以分為如下幾個步驟:
1、a系統預提交訊息。
2、訊息伺服器儲存訊息,但是處於未提交狀態,不能被b系統消費。
3、訊息伺服器給予響應。
4、a系統處理本地業務。
5、a系統提交事務。
可能會存在的問題:
1、第1、2、3步其中之一出現問題,則不會執行a系統本地業務,故不會出現問題。
2、第4步如果執行失敗,則直接回滾此操作。
3、第5步如果執行失敗,則訊息伺服器不知道a系統的執行狀態,這個場景下,我們需要在a系統中開放查詢介面,供訊息伺服器反查。如果查詢到a系統的狀態是已提交,則訊息伺服器將同步此狀態,使得b系統可以正常消費。如果查詢到a系統的狀態是已回滾,則訊息伺服器將這個訊息刪除。
通過以上操作,我們可以保證a系統的業務執行狀態和訊息的傳送狀態是一致的。可能有的同學會有所疑問,上述操作有點繁瑣,為何不先執行a業務,再提交訊息和事務呢?如下圖:
仔細思考一下,這樣做是存在問題的。a業務處理成功後,訊息預提交階段可能會失敗,比如網路原因或者訊息伺服器自身內部原因,導致這個訊息沒有持久化。正因為沒有持久化,訊息伺服器不會進行反查,這會導致a業務處理狀態和訊息伺服器的訊息狀態不一致,更別談被b系統消費了。
服務端消費分為如下幾個步驟:
1、b系統消費訊息。
2、b系統處理本地業務。
3、消費響應,此時訊息伺服器可以將訊息刪除。
在服務端消費部分,我們要保證消費一定要成功。可能會出現以下情況:
1、b系統無法接受到訊息。
2、b系統處理本地業務失敗,無法給予訊息伺服器響應。
這兩種場景下,我們需要對訊息伺服器提出要求,如果再超時時間範圍內,仍然獲取不到b系統的消費響應,則進行超時重發,當然b系統需要保證冪等性。但是超時重發需要注意一下,因為有可能b系統一直執行失敗,不能陷入無限的重發操作中。這時,我們需要在訊息伺服器層對訊息屬性進行定義,即設定乙個超時重發的次數,超過了就不在重發,避免資源浪費。訊息重發次數如果達到了閾值,說明我們的系統可能出現了問題,這種場景要能夠被監控平台捕捉,以便及早的進行人工干預。
設計再嚴格的系統,我們都不能掉以輕心。理想狀態下,ab系統是可以保證資料的一致性,但不排除有其他意外情況。我們可以根據業務規則,對ab系統的資料進行監控,如果出現不一致的情況,要及早的進行人工干預。
基於訊息中介軟體的分布式事務
關於分布式事務的實現,網上有很多解說,當然這也是面試官的常備面試題。很多朋友在工作中很少接觸到分布式事務,認為這個玩意互動太多,沒必要。其實我也是這麼想的,想要完成乙個完整的分布式事務鏈路,通訊開銷實在太多。而現如今,微服務架構在行業內大行其道,恨不得所有模組都用上微服務來管理,而不知道自己已經慢慢...
分布式訊息中介軟體
一 分布式訊息中介軟體入門 訊息中介軟體主要實現分布式系統中解耦 非同步訊息 流量銷鋒 日誌處理等場景。現在生產中用得最多的訊息佇列有 activemq,rabbitmq,kafka,rocketmq 等。jms 規範 類似於 jdbc 的一套介面規範,但不同的是他是面向的訊息服務,提供一套標準 a...
訊息中介軟體MQ 基於RabbitMQ分布式事務處理
rabbitmq是開源的amqp 一種訊息佇列協議,適合金融行業,高可靠性 實現,在分布系統訊息可靠性,支援集群,豐富的訊息分發機制表現不錯,客戶端與spring整合緊密。可以使用managment外掛程式實現web監控和管理。rabbitmq核心概念 支援訊息持久化 exchange持久化 que...