RocketMQ 事務訊息

2021-09-10 23:34:05 字數 1279 閱讀 1490

一、事務訊息實現方式

應用使用事務訊息的步驟:

(1)應用傳送訊息,使用prepare欄位標示準備訊息

(2)應用執行本地業務邏輯

(3)應用傳送事務提交或回滾訊息

broker收到prepare訊息後會將topic替換為rmq_sys_trans_half_topic,queueid替換為0,然後寫入commitlog,原有topic與queueid資訊寫入real_topic與real_qid欄位中,因為沒有投遞到真實的業務主題的佇列上,下游系統並不會感知到訊息的存在。

當broker收到commit訊息後,會查出原有訊息體,將real_topic與real_qid資訊寫入topic和queueid,再回寫到commitlog中,此時下游系統便可以進行消費。broker會向commitlog寫入一條表示prepare訊息已經完成的訊息,topic是rmq_sys_trans_op_half_topic,queueid與rmq_sys_trans_half_topic中訊息的queueid一致。

二、事務回查機制

訊息寫入commitlog後,不能刪除也不可更改,broker為確定prepare訊息的狀態,需要一種回查機制,不斷檢查prepare訊息佇列來確定,主要通過事務回查執行緒來完成(transactionalmessagecheckservice)。

rmq_sys_trans_half_topic佇列儲存準備訊息,處理進度用prepareoffset表示,rmq_sys_trans_op_half_topic儲存已經完成的準備訊息,處理進度用opoffset表示,兩個訊息佇列如下如所示。             

在rmq_sys_trans_op_half_topic中從opoffset開始先查出32個訊息放在opmsglist中,訊息內容是rmq_sys_trans_half_topic中 對應msg的offset。

(1)回查執行緒從prepareoffset開始遍歷prepre訊息列表,如果訊息偏移量在opmsglist中,則表示該訊息已經完成,prepareoffset向下移動。

(2)如果訊息偏移量不在opmsglist中,並且訊息被回查次數未超過最大次數,則會構建新的訊息重新寫入commitlog,留作以後回查。如果超過回查次數,則直接pass。注意:重新寫入commitlog的策略有很多,不止一種。

(3)順序更新opoffset

總結:此中回查機制實時性比較差,如果某條訊息一致未傳送完成訊息,則回查機制需要不斷回查,直到滿足回查次數或超時。

RocketMQ事務訊息思路

通過訊息佇列 rocketmq 事務訊息,能達到分布式事務的最終一致。模擬a賬戶轉賬給b賬戶操作,這個分布式事務有兩個子事務 子事務a areducetransaction 代表a賬戶扣款 子事務b bincreasetransaction 代表b賬戶收款 一 向訊息佇列伺服器傳送半訊息 半訊息無法...

RocketMQ之事務訊息

由於工作流引擎專案中,工作流引擎服務和業務服務是分開的,所以就涉及到了分布式事務的問題。綜合考慮到併發量和分布式事務的保障,最終選擇了事務訊息的方式。首先我們來介紹下本地訊息表這種方案,當訊息佇列不支援事務訊息的時候,我們可以考慮這種方案。基本流程 1 a 系統在自己本地乙個事務裡操作同時,插入一條...

RocketMQ事務訊息實現分析

這週rocketmq發布了4.3.0版本,new feature中最受關注的一點就是支援了事務訊息 今天花了點時間看了下具體的實現內容,下面是簡單的總結。通過馮嘉發布的 rocketmq 4.3正式發布,支援分布式事務 一文可以看到rocketmq採用了2pc的方案來提交事務訊息,同時增加乙個補償邏...