RocketMQ實(shí)現(xiàn)分布式事務(wù)原理

舉個(gè)分布式事務(wù)場(chǎng)景

列子:假設(shè) A 給 B 轉(zhuǎn) 100塊錢(qián)饭聚,同時(shí)它們不是同一個(gè)服務(wù)上糖权。

目標(biāo):就是 A 減100塊錢(qián)举畸,B 加100塊錢(qián)箕别。

實(shí)際情況可能有四種:

1)就是A賬戶(hù)減100 (成功),B賬戶(hù)加100 (成功)
2)就是A賬戶(hù)減100(失斉砦怼)碟刺,B賬戶(hù)加100 (失敗)
3)就是A賬戶(hù)減100(成功)薯酝,B賬戶(hù)加100 (失敯牍痢)
4)就是A賬戶(hù)減100 (失敗)吴菠,B賬戶(hù)加100 (成功)

這里 第1第2 種情況是能夠保證事務(wù)的一致性的者填,但是 第3第4 是無(wú)法保證事務(wù)的一致性的。

那我們來(lái)看下RocketMQ是如何來(lái)保證事務(wù)的一致性的

RocketMQ實(shí)現(xiàn)分布式事務(wù)原理

1做葵、基礎(chǔ)概念

  • 最終一致性

RocketMQ是一種最終一致性的分布式事務(wù)占哟,就是說(shuō)它保證的是消息最終一致性,而不是像2PC酿矢、3PC榨乎、TCC那樣強(qiáng)一致分布式事務(wù),至于為什么說(shuō)它是最終一致性事務(wù)下面會(huì)詳細(xì)說(shuō)明棠涮。

  • Half Message(半消息)

是指暫不能被Consumer消費(fèi)的消息谬哀。Producer 已經(jīng)把消息成功發(fā)送到了 Broker 端刺覆,但此消息被標(biāo)記為暫不能投遞狀態(tài)严肪,處于該種狀態(tài)下的消息稱(chēng)為半消息。需要 Producer對(duì)消息的二次確認(rèn)后谦屑,Consumer才能去消費(fèi)它驳糯。

  • 消息回查

由于網(wǎng)絡(luò)閃段,生產(chǎn)者應(yīng)用重啟等原因氢橙。導(dǎo)致 Producer 端一直沒(méi)有對(duì) Half Message(半消息) 進(jìn)行 二次確認(rèn)酝枢。這是Brock服務(wù)器會(huì)定時(shí)掃描長(zhǎng)期處于半消息的消息,會(huì)主動(dòng)詢(xún)問(wèn)Producer端 該消息的最終狀態(tài)(Commit或者Rollback),該消息即為 消息回查悍手。

2帘睦、分布式事務(wù)交互流程

理解這張阿里官方的圖,就能理解RocketMQ分布式事務(wù)的原理了坦康。


image.png

說(shuō)明

1竣付、A服務(wù)先發(fā)送個(gè)Half Message給Brock端,消息中攜帶 B服務(wù) 即將要+100元的信息滞欠。
2古胆、當(dāng)A服務(wù)知道Half Message發(fā)送成功后,那么開(kāi)始第3步執(zhí)行本地事務(wù)。
3逸绎、執(zhí)行本地事務(wù)(會(huì)有三種情況1惹恃、執(zhí)行成功。2棺牧、執(zhí)行失敗巫糙。3、網(wǎng)絡(luò)等原因?qū)е聸](méi)有響應(yīng))
4.1)颊乘、如果本地事務(wù)成功曲秉,那么Product像Brock服務(wù)器發(fā)送Commit,這樣B服務(wù)就可以消費(fèi)該message。
4.2)疲牵、如果本地事務(wù)失敗承二,那么Product像Brock服務(wù)器發(fā)送Rollback,那么就會(huì)直接刪除上面這條半消息。
4.3)纲爸、如果因?yàn)榫W(wǎng)絡(luò)等原因遲遲沒(méi)有返回失敗還是成功亥鸠,那么會(huì)執(zhí)行RocketMQ的回調(diào)接口,來(lái)進(jìn)行事務(wù)的回查。

從上面流程可以得知 只有A服務(wù)本地事務(wù)執(zhí)行成功 识啦,B服務(wù)才能消費(fèi)該message负蚊。

然后我們?cè)賮?lái)思考幾個(gè)問(wèn)題?

為什么要先發(fā)送Half Message(半消息)

我覺(jué)得主要有兩點(diǎn):

1)可以先確認(rèn) Brock服務(wù)器是否正常 颓哮,如果半消息都發(fā)送失敗了 那說(shuō)明Brock掛了家妆。
2)可以通過(guò)半消息來(lái)回查事務(wù),如果半消息發(fā)送成功后一直沒(méi)有被二次確認(rèn)冕茅,那么就會(huì)回查事務(wù)狀態(tài)伤极。

什么情況會(huì)回查

也會(huì)有兩種情況:

1)執(zhí)行本地事務(wù)的時(shí)候,由于突然網(wǎng)絡(luò)等原因一直沒(méi)有返回執(zhí)行事務(wù)的結(jié)果(commit或者rollback)導(dǎo)致最終返回UNKNOW姨伤,那么就會(huì)回查哨坪。
2) 本地事務(wù)執(zhí)行成功后,返回Commit進(jìn)行消息二次確認(rèn)的時(shí)候的服務(wù)掛了乍楚,在重啟服務(wù)那么這個(gè)時(shí)候在brock端
它還是個(gè)Half Message(半消息)当编,這也會(huì)回查。

特別注意: 如果回查徒溪,那么一定要先查看當(dāng)前事務(wù)的執(zhí)行情況忿偷,再看是否需要重新執(zhí)行本地事務(wù)。
想象下如果出現(xiàn)第二種情況而引起的回查臊泌,如果不先查看當(dāng)前事務(wù)的執(zhí)行情況鲤桥,而是直接執(zhí)行事務(wù),那么就相當(dāng)于成功執(zhí)行了兩個(gè)本地事務(wù)缺虐。

為什么說(shuō)MQ是最終一致性事務(wù)

通過(guò)上面這幅圖芜壁,我們可以看出,在上面舉例事務(wù)不一致的兩種情況中,永遠(yuǎn)不會(huì)發(fā)生

A賬戶(hù)減100 (失敾弁)顷牌,B賬戶(hù)加100 (成功)

因?yàn)?/strong>:如果A服務(wù)本地事務(wù)都失敗了,那B服務(wù)永遠(yuǎn)不會(huì)執(zhí)行任何操作塞淹,因?yàn)橄焊筒粫?huì)傳到B服務(wù)窟蓝。

那么 A賬戶(hù)減100 (成功),B賬戶(hù)加100 (失敱テ铡) 會(huì)不會(huì)可能存在的运挫。

答案是會(huì)的

因?yàn)锳服務(wù)只負(fù)責(zé)當(dāng)我消息執(zhí)行成功了,保證消息能夠送達(dá)到B,至于B服務(wù)接到消息后最終執(zhí)行結(jié)果A并不管套耕。

那B服務(wù)失敗怎么辦谁帕?

如果B最終執(zhí)行失敗,幾乎可以斷定就是代碼有問(wèn)題所以才引起的異常冯袍,因?yàn)橄M(fèi)端RocketMQ有重試機(jī)制匈挖,如果不是代碼問(wèn)題一般重試幾次就能成功。

如果是代碼的原因引起多次重試失敗后康愤,也沒(méi)有關(guān)系儡循,將該異常記錄下來(lái),由人工處理征冷,人工兜底處理后择膝,就可以讓事務(wù)達(dá)到最終的一致性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末检激,一起剝皮案震驚了整個(gè)濱河市肴捉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呵扛,老刑警劉巖每庆,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異今穿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)伦籍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)蓝晒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人帖鸦,你說(shuō)我怎么就攤上這事芝薇。” “怎么了作儿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵洛二,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晾嘶,這世上最難降的妖魔是什么妓雾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮垒迂,結(jié)果婚禮上械姻,老公的妹妹穿的比我還像新娘。我一直安慰自己机断,他們只是感情好楷拳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吏奸,像睡著了一般欢揖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奋蔚,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天浸颓,我揣著相機(jī)與錄音,去河邊找鬼旺拉。 笑死产上,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛾狗。 我是一名探鬼主播晋涣,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沉桌!你這毒婦竟也來(lái)了谢鹊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤留凭,失蹤者是張志新(化名)和其女友劉穎佃扼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蔼夜,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼耀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了求冷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘤运。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匠题,靈堂內(nèi)的尸體忽然破棺而出拯坟,到底是詐尸還是另有隱情,我是刑警寧澤韭山,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布郁季,位于F島的核電站冷溃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梦裂。R本人自食惡果不足惜似枕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塞琼。 院中可真熱鬧菠净,春花似錦、人聲如沸彪杉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)派近。三九已至攀唯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渴丸,已是汗流浹背侯嘀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谱轨,地道東北人戒幔。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像土童,于是被迫代替她去往敵國(guó)和親诗茎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容