RocketMQ 事務訊息

2022-09-22 22:15:07 字數 1416 閱讀 3721

rocketmq 事務訊息在實現上充分利用了 rocketmq 本身機制,在實現零依賴的基礎上,同樣實現了高效能、可擴充套件、全非同步等一系列特性。

在具體實現上,rocketmq 通過使用 half topic 以及 operation topic 兩個內部佇列來儲存事務訊息推進狀態,如下圖所示:

其中,half topic 對應佇列中存放著 prepare 訊息,operation topic 對應的佇列則存放了 prepare message 對應的 commit/rollback 訊息,訊息體中則是 prepare message 對應的 offset,服務端通過比對兩個佇列的差值來找到尚未提交的超時事務,進行回查。

在具體實現上,事務訊息作為普通訊息的一個應用場景,在實現過程中進行了分層抽象,從而避免了對 rocketmq 原有儲存機制的修改,如下圖所示:

從使用者側來說,使用者需要分別實現本地事務執行以及本地事務回查方法,因此只需關注本地事務的執行狀態即可;而在 service 層,則對事務訊息的兩階段提交進行了抽象,同時針對超時事務實現了回查邏輯,通過不斷掃描當前事務推進狀態,來不斷反向請求 producer 端獲取超時事務的執行狀態,在避免事務掛起的同時,也避免了 producer 端的單點故障。而在儲存層,rocketmq 通過 bridge 封裝了與底層佇列儲存的相關操作,用以操作兩個對應的內部佇列,使用者也可以依賴其他儲存介質實現自己的 service,rocketmq 會通過 serviceprovider 載入進來。

從上述事務訊息設計中可以看到,rocketmq 事務訊息較好的解決了事務的最終一致性問題,事務發起方僅需要關注本地事務執行以及實現回查介面給出事務狀態判定等實現,而且在上游事務峰值高時,可以通過訊息佇列,避免對下游服務產生過大壓力。

事務訊息不僅適用於上游事務對下游事務無依賴的場景,還可以與一些傳統分散式事務架構相結合,而 mq 的服務端作為天生的具有高可用能力的協調者,使得我們未來可以基於 rocketmq 提供一站式輕量級分散式事務解決方案,用以滿足各種場景下的分散式事務需求。

事務訊息作為一種非同步確保型事務,  將兩個事務分支通過 mq 進行非同步解耦,rocketmq 事務訊息的設計流程同樣借鑑了兩階段提交理論,整體互動流程如下圖所示:

事務發起方首先傳送 prepare(即傳送half訊息) 訊息到 mq。

在傳送 prepare 訊息成功後(即收到half訊息傳送成功的回執訊息) ,執行本地事務(業務系統自己的本地事物邏輯**)。

根據本地事務執行結果,返回給mq傳送方傳送: commit 或者是 rollback。

如果mq傳送方接收到的訊息是: rollback,mq 將刪除該 prepare 訊息不進行下發,如果是 commit 訊息,mq 將會把這個訊息傳送給 consumer 端。

如果執行本地事務過程中,執行端掛掉,或者超時,mq 將會不停的詢問其同組的其他 producer 來獲取狀態。

consumer 端的消費成功機制有 mq 保證。

Spring整合Rocketmq

不同於 rabbitmq activemq kafka 等訊息中介軟體,spring 社群已經通過多種方式提供了對這些中介軟體產品整合,例如...

rocketmq總結

1 角色關係 2 順序訊息 消費訊息的順序要同収送訊息的順序一致,在 rocketmq 中,主要挃的是區域性順序,即一類訊息為滿足順序性,必...

RocketMQ基本概念

生產者傳送業務系統產生的訊息給broker。rocketmq提供了多種傳送方式 同步的 非同步的 單向的。 具有相同角色的生產者被分到一組。...