04-消息實現(xiàn)分布式事務(wù)

問題

場景:訂單系統(tǒng)創(chuàng)建訂單成功,需購物車系統(tǒng)清空購物車中的訂單

訂單創(chuàng)建

業(yè)務(wù)執(zhí)行步驟:

  • 在訂單庫中插入一條訂單數(shù)據(jù)瞬捕,創(chuàng)建訂單学搜;
  • 發(fā)消息給消息隊列,消息的內(nèi)容就是剛剛創(chuàng)建的訂單多柑;

在分布式系統(tǒng)中上述兩個步驟都有可能失敗:

  • 創(chuàng)建了訂單楣责,沒有清理購物車竣灌;
  • 訂單沒創(chuàng)建成功,購物車里面的商品卻被清掉了秆麸;

需要解決的問題:上述任意步驟都有可能失敗的情況下初嘹,還要保證訂單庫和購物車庫這兩個庫的數(shù)據(jù)一致性。

對于購物車系統(tǒng)收到消息清理購物車處理比較簡單沮趣,只有成功刪除購物車才提交消息確認屯烦,否則重試

關(guān)鍵是在訂單系統(tǒng)中的 創(chuàng)建訂單和發(fā)送消息的兩個步驟如何確保同時成功或失敗

什么是事務(wù)

嚴格意義上的事務(wù)具有4個屬性:原子性、一致性房铭、隔離性驻龟、持久性

  • 原子性:操作不能再分割,要么成功要么失敗缸匪,不能一半成功一半失敗
  • 一致性:是指這些數(shù)據(jù)在事務(wù)執(zhí)行完成這個時間點之前翁狐,讀到的一定是更新前的數(shù)據(jù),之后讀到的一定是更新后的數(shù)據(jù)凌蔬,不應(yīng)該存在一個時刻露懒,讓用戶讀到更新過程中的數(shù)據(jù)闯冷。
  • 隔離性:是指一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對正在進行的其他事務(wù)是隔離的懈词,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾蛇耀。
  • 持久性:是指一個事務(wù)一旦完成提交,后續(xù)的其他操作和故障都不會對事務(wù)的結(jié)果產(chǎn)生任何影響坎弯。

分布式事務(wù)

是在分布式系統(tǒng)中實現(xiàn)事務(wù)纺涤,在分布式事務(wù)中嚴格按事務(wù)的標準來要求是不可能實現(xiàn)的,光要實現(xiàn)數(shù)據(jù)的一致性就非常困難荞怒,最終只能保證順序的一致性洒琢、以及最終一致性

常見的分布式實現(xiàn)方式

  • 2PC(Two-phase Commit,也叫二階段提交)
  • TCC(Try-Confirm-Cancel)
  • 事務(wù)消息

每一種實現(xiàn)都有其特定的使用場景褐桌,也有各自的問題衰抑,都不是完美的解決方案

2pc和tcc這里不做討論,主要來看下事務(wù)消息

消息隊列如何實現(xiàn)事務(wù)

事務(wù)消息需要消息隊列提供相應(yīng)的功能才能實現(xiàn)荧嵌,rocketmq和kafka都提供了事務(wù)相關(guān)功能

回到訂單系統(tǒng)的例子看如何實現(xiàn):


消息事務(wù)

步驟:

  • 1呛踊、開啟一個消息事務(wù)
  • 2、訂單系統(tǒng)給消息服務(wù)發(fā)送一個半消息

半消息的消息內(nèi)容是完整的只是在事務(wù)沒有提交之前消費者是不可見的

  • 3啦撮、執(zhí)行本地事務(wù)創(chuàng)建訂單
  • 4谭网、提交或回滾消息事務(wù)

如果創(chuàng)建訂單成功則提交消息事務(wù),消息會投遞到購物車系統(tǒng)赃春,創(chuàng)建失敗則回滾事務(wù)消息

問題:提交消息事務(wù)失敗怎么辦

kafka比較粗暴愉择,直接拋出異常讓用戶自己解決,我們可以在業(yè)務(wù)代碼中反復(fù)提交知道提交成功织中,或刪除原來創(chuàng)建成功的訂單進行補償锥涕;rocketmq提供了另外一種解決方式

rocketmq分布式事務(wù)實現(xiàn)

事務(wù)反查機制

rocketmq提供了事務(wù)反查的機制,如果因網(wǎng)絡(luò)或其他原因?qū)е聄ocketmq沒有收到訂單系統(tǒng)的事務(wù)的提交或者回滾狭吼,會定期取訂單系統(tǒng)反查這個消息事務(wù)對應(yīng)的本地事務(wù)的狀態(tài)层坠,從而來確定事務(wù)是提交還是回滾,為了支持反查刁笙,業(yè)務(wù)代碼需要實現(xiàn)一個反查本地事務(wù)狀態(tài)的接口

反查機制

最后

kafka需要自己寫代碼來解決問題破花,rocketmq通過反查機制解決,并不代表rocketmq事務(wù)功能比kafka好疲吸,只能說在此例場景更適合座每,Kafka 對于事務(wù)的定義、實現(xiàn)和適用場景摘悴,和 RocketMQ 有比較大的差異尺栖,后面的課程中,我們會專門講到 Kafka 的事務(wù)的實現(xiàn)原理烦租。

內(nèi)容來源說明:文章中的部分內(nèi)容以及圖片來自《極客時間-消息隊列高手課》延赌,寫文章目的只是作為學(xué)習(xí)后的總結(jié)和整理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末除盏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挫以,更是在濱河造成了極大的恐慌者蠕,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掐松,死亡現(xiàn)場離奇詭異踱侣,居然都是意外死亡,警方通過查閱死者的電腦和手機大磺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門抡句,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杠愧,你說我怎么就攤上這事待榔。” “怎么了流济?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵锐锣,是天一觀的道長。 經(jīng)常有香客問我绳瘟,道長雕憔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任糖声,我火速辦了婚禮斤彼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蘸泻。我一直安慰自己琉苇,他們只是感情好,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布蟋恬。 她就那樣靜靜地躺著翁潘,像睡著了一般趁冈。 火紅的嫁衣襯著肌膚如雪歼争。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天渗勘,我揣著相機與錄音沐绒,去河邊找鬼。 笑死旺坠,一個胖子當著我的面吹牛乔遮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播取刃,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蹋肮,長吁一口氣:“原來是場噩夢啊……” “哼出刷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坯辩,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤馁龟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漆魔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坷檩,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年改抡,在試婚紗的時候發(fā)現(xiàn)自己被綠了矢炼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡阿纤,死狀恐怖句灌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阵赠,我是刑警寧澤涯塔,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站清蚀,受9級特大地震影響匕荸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枷邪,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一榛搔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧东揣,春花似錦践惑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芥吟,卻和暖如春侦铜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钟鸵。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工钉稍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棺耍。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓贡未,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俊卤,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350