RocketMQ事務性消息的設計

概念介紹

Half(Prepare) Message: 指暫時不能傳遞的消息。當消息成功發送到MQ服務器,但服務器沒有收到來自生產者的消息的第二個確認,則該消息被標記爲「臨時不可交付」。此狀態中的消息稱爲半提交消息(Prepare消息)。服務器

Message Status Check: 在網絡斷開或生產者應用程序從新啓動,可能致使丟失第二個確認事務的消息。當MQ服務器發現一條消息長時間保持爲半提交消息轉態時,它將向消息生產者發送一個請求,檢查消息的最終狀態(提交或回滾)。網絡

事務性消息執行流程

RocketMQ的事物執行流程以下圖所示: 架構

Execute Flow Chart

  1. 生產者發送Prepare消息到MQ服務器。
  2. 成功發送Prepare消息後,執行本地事務。
  3. 根據本地事務結果向MQ服務器發送提交或回滾消息。
  4. 若是在本地事務執行中生產者將提交/回滾消息丟失,或懸而未決。MQ服務器將檢查消息發送到同一組中的每一個生產者,以此來得到消息本地事務執行的狀態。
  5. 根據本地事務狀態生成應答提交/回滾消息。
  6. 提交的消息將會提供給消費者消費,可是回滾的消息將被MQ服務器丟棄。

設計細節

RocketMQ的事務性消息設計架構總覽以下圖: 設計

Outline
如圖所示,爲了屏蔽存儲的底層實現,全部事務消息操做都集中在事務服務接口上。RocketMQ提供了一個它本身實現的默認存儲系,咱們使用事務橋實現事務性存儲邏輯,而不是直接修改RocketMQ的存儲層。

發送事務性消息

Sending transactional message
上圖描述了發送事務性消息的時序圖。從該圖中,咱們能夠清楚地看到事務性消息是如何在兩個階段提交的.

檢查事務性消息

Checking transactional message
上圖描述了檢查事務消息狀態的時序圖,當MQ服務器發現消息在很長一段時間內還是半提交的狀態,它將發送一個請求消息,來獲得當前消息的事務狀態。
相關文章
相關標籤/搜索