首页
/
每日頭條
/
圖文
/
rocket mq延遲消息隊列實現原理
rocket mq延遲消息隊列實現原理
更新时间:2026-01-27 02:18:26

有關RocketMQ實現分布式事務的理論知識,下篇也會示例 通過SpringCloud來實例RocketMQ實現分布式事務的項目。

一、舉個分布式事務場景

列子:假設 AB100塊錢,同時它們不是同一個服務商。

目标:就是 A 減100塊錢,B 加100塊錢。

實際情況可能有四種:

1)就是A賬戶減100 (成功),B賬戶加100 (成功)

2)就是A賬戶減100(失敗),B賬戶加100 (失敗)

3)就是A賬戶減100(成功),B賬戶加100 (失敗)

4)就是A賬戶減100 (失敗),B賬戶加100 (成功)

這裡 第1和第2 種情況是能夠保證事務的一緻性的,但是 第3和第4 是無法保證事務的一緻性的。

那我們來看下RocketMQ是如何來保證事務的一緻性的。

二、RocketMQ實現分布式事務原理

RocketMQ雖然之前也支持分布式事務,但并沒有開源,等到RocketMQ 4.3才正式開源。

1、基礎概念

最終一緻性

RocketMQ是一種最終一緻性的分布式事務,就是說它保證的是消息最終一緻性,而不是像2PC、3PC、TCC那樣強一緻分布式事務,至于為什麼說它是最終一緻性事務下面會詳細說明。

Half message(半消息)

是指暫不能被Consumer消費的消息。Producer 已經把消息成功發送到了 Broker 端,但此消息被标記為暫不能投遞狀态,處于該種狀态下的消息稱為半消息。需要 Producer

對消息的二次确認後,Consumer才能去消費它。

消息回查

由于網絡閃段,生産者應用重啟等原因。導緻 Producer 端一直沒有對 Half Message(半消息) 進行 二次确認。這是Brock服務器會定時掃描長期處于半消息的消息,會

主動詢問 Producer端 該消息的最終狀态(Commit或者Rollback),該消息即為 消息回查

2、分布式事務交互流程

理解這張阿裡官方的圖,就能理解RocketMQ分布式事務的原理了。

rocket mq延遲消息隊列實現原理(RocketMQ實現分布式事務原理)1

我們來說明下上面這張圖

1、A服務先發送給Half Message給Brock端,消息中攜帶 B服務 即将要 100元的信息。

2、當A服務知道Half Message發送成功後,那麼開始第3步執行本地事務。

3、執行本地事務(會有三種情況1、執行成功。2、執行失敗。3、網絡等原因導緻沒有響應)

4.1)、如果本地事務成功,那麼Product向Brock服務器發送Commit,這樣B服務就可以消費該message。

4.2)、如果本地事務失敗,那麼Product向Brock服務器發送Rollback,那麼就會直接删除上面這條半消息。

4.3)、如果因為網絡等原因遲遲沒有返回失敗還是成功,那麼會執行RocketMQ的回調接口,來進行事務的回查。

從上面流程可以得知隻有A服務本地事務執行成功 ,B服務才能消費該message。

然後我們再來思考幾個問題?

rocket mq延遲消息隊列實現原理(RocketMQ實現分布式事務原理)2

為什麼要先發送Half Message(半消息)

我覺得主要有兩點

1)可以先确認 Brock服務器是否正常 ,如果半消息都發送失敗了 那說明Brock挂了。

2)可以通過半消息來回查事務,如果半消息發送成功後一直沒有被二次确認,那麼就會回查事務狀态。

什麼情況會回查

也會有兩種情況

1)執行本地事務的時候,由于突然網絡等原因一直沒有返回執行事務的結果(commit或者rollback)導緻最終返回UNKNOW,那麼就會回查。

2) 本地事務執行成功後,返回Commit進行消息二次确認的時候的服務挂了,在重啟服務那麼這個時候在brock端

它還是個Half Message(半消息),這也會回查。

特别注意: 如果回查,那麼一定要先查看當前事務的執行情況,再看是否需要重新執行本地事務。

想象下如果出現第二種情況而引起的回查,如果不先查看當前事務的執行情況,而是直接執行事務,那麼就相當于成功執行了兩個本地事務。

為什麼說MQ是最終一緻性事務

通過上面這幅圖,我們可以看出,在上面舉例事務不一緻的兩種情況中,永遠不會發生

A賬戶減100 (失敗),B賬戶加100 (成功)

因為:如果A服務本地事務都失敗了,那B服務永遠不會執行任何操作,因為消息壓根就不會傳到B服務。

那麼 A賬戶減100 (成功),B賬戶加100 (失敗) 會不會可能存在的。

答案是會的

因為A服務隻負責當我消息執行成功了,保證消息能夠送達到B,至于B服務接到消息後最終執行結果A并不管。

那B服務失敗怎麼辦?

如果B最終執行失敗,幾乎可以斷定就是代碼有問題所以才引起的異常,因為消費端RocketMQ有重試機制,如果不是代碼問題一般重試幾次就能成功。

如果是代碼的原因引起多次重試失敗後,也沒有關系,将該異常記錄下來,由人工處理,人工兜底處理後,就可以讓事務達到最終的一緻性。

最後

不管多忙,每天給自己預留至少半小時的學習時間,拒絕做代碼垃圾的搬運工!

有不對的地方可以在評論區留言,覺得不錯的朋友希望能得到您的轉發支持,同時可以持續關注我,每周定期會分享3到4篇精選幹貨!

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
弱者如何讓自己立于不敗之地(懂得弱者道之用)
弱者如何讓自己立于不敗之地(懂得弱者道之用)
  老子在《道德經》第40章中說:“弱者道之用。”是什麼意思呢?   “弱”,柔弱;“用”,作用。這句話的意思是,“道”的作用是柔弱的。   一說到柔軟,人們自然會想到軟弱無力,像林黛玉一樣,弱不禁風,弱風扶柳一般嬌弱,經不起風吹雨打。   老子所說的“道”,其中的一個内涵就是指規律,規律是客觀存在的,不以人的意志為轉移,這就決定了人隻能服從規律,按客觀規律...
2026-01-27
核苷酸填充面部的危害(人們說我像辛普森)
核苷酸填充面部的危害(人們說我像辛普森)
  據英國《太陽報》報道,一名英國女子在嘴唇填充物溶解後出現了嚴重過敏反應,被緊急送往醫院。      報道截圖   這名女性化名露比,她在短視頻平台TikTok上分享了這段痛苦的經曆,該視頻在一天内被觀看了近50萬次。   據露比說,過敏反應非常糟糕,導緻她上唇腫大,臉部腫脹。盡管在一些照片中露比面帶微笑,但她表示,她再也不想做嘴唇整形了。   報道稱,有...
2026-01-27
錦心似玉譚松韻是自己配音嗎(錦心似玉譚松韻飾演的十一娘怼人功夫實在了得啊)
錦心似玉譚松韻是自己配音嗎(錦心似玉譚松韻飾演的十一娘怼人功夫實在了得啊)
  昨晚由鐘漢良、譚松韻主演的《錦心似玉》開播,在播出的劇集當中,十一娘可稱得上是智慧擔當了,那怼人的功夫實在了得啊!   十一娘ko二娘   二娘為掙得嫁入徐府續弦正室,設計陷害十一娘與王世子的親事,被十一娘拆穿,并狠狠地回敬過去。         十一娘ko喬姨娘      十一娘ko自家相公      三殺!ok!這個怼天怼地地徐府主母可越來越有主母地...
2026-01-27
道德經反者道之動弱者道之用原文(道德經第四十章反者道之動)
道德經反者道之動弱者道之用原文(道德經第四十章反者道之動)
  詳細解讀《道德經》40      反動弱用   〈原文〉   反者道之動,弱者道之用。   天下萬物生于有,有生于無。   〈注釋〉   反:翻轉,反向,相反。   弱:柔弱。   〈譯文〉   向自己的反面運動,是道的運動特征;   依靠柔弱發揮作用,是道的應用特征。   天地萬物總稱為有,有生于無。   〈解讀〉   本章主要是闡述了道的運動特征和道...
2026-01-27
地下城堡2 雲之國攻略(地下城堡2史上最豪華福利活動)
地下城堡2 雲之國攻略(地下城堡2史上最豪華福利活動)
  經典的地牢探險與模拟經營手遊《地下城堡2》将于1月17日推出年度重制版。從遊戲畫面到人物角色都将全面換新,并且會有新的玩法内容更新。      圖1:年度重制版1月17日上線   随着本次更新,遊戲内也将開展各式各樣的福利活動,這在之前的版本中都是沒有的。單看禮包就囊括了登陸、充值等多種類型的禮包,讓人目不暇接。   回家的誘惑一:全服送SS英雄   本...
2026-01-27
Copyright 2023-2026 - www.tftnews.com All Rights Reserved