用事務消息實現(xiàn)分布式事務

事務

一個嚴格意義的事務實現(xiàn)纺座,應該具有 4 個屬性:原子性、一致性溉潭、隔離性净响、持久性。這四
個屬性通常稱為 ACID 特性喳瓣。

  • 原子性馋贤,是指一個事務操作不可分割,要么成功畏陕,要么失敗掸掸,不能有一半成功一半失敗的情
    況。

  • 一致性蹭秋,是指這些數(shù)據(jù)在事務執(zhí)行完成這個時間點之前扰付,讀到的一定是更新前的數(shù)據(jù),之后
    讀到的一定是更新后的數(shù)據(jù)仁讨,不應該存在一個時刻羽莺,讓用戶讀到更新過程中的數(shù)據(jù)。

  • 隔離性洞豁,是指一個事務的執(zhí)行不能被其他事務干擾盐固。即一個事務內(nèi)部的操作及使用的數(shù)據(jù)對
    正在進行的其他事務是隔離的,并發(fā)執(zhí)行的各個事務之間不能互相干擾丈挟,這個有點兒像我們
    打網(wǎng)游中的副本刁卜,我們在副本中打的怪和掉的裝備,與其他副本沒有任何關聯(lián)也不會互相影
    響曙咽。

  • 持久性蛔趴,是指一個事務一旦完成提交,后續(xù)的其他操作和故障都不會對事務的結(jié)果產(chǎn)生任何
    影響例朱。

分布式事務

目前大家所說的分布式事務孝情,
更多情況下鱼蝉,是在分布式系統(tǒng)中事務的不完整實現(xiàn)。在不同的應用場景中箫荡,有不同的實現(xiàn)魁亦,
目的都是通過一些妥協(xié)來解決實際問題。
在實際應用中羔挡,比較常見的分布式事務實現(xiàn)有 2PC(Two-phase Commit洁奈,也叫二階段提
交)、TCC(Try-Confirm-Cancel) 和事務消息绞灼。每一種實現(xiàn)都有其特定的使用場景睬魂,也有
各自的問題,都不是完美的解決方案镀赌。

事務消息

  • 消息隊列中的“事務”氯哮,主要解決的是消息生產(chǎn)者和消息消費者的數(shù)據(jù)一致性問題。
    事務消息適用的場景主要是那些需要異步更新數(shù)據(jù)商佛,并且對數(shù)據(jù)實時性要求不太高的場景喉钢。

一個小例子:

消息隊列是實現(xiàn)分布式事務

image.png
  • 訂單系統(tǒng)在消息隊列上開啟一個事務。
  • 訂單系統(tǒng)給消息服務器發(fā)送一個“半消
    息”良姆,這個半消息不是說消息內(nèi)容不完整肠虽,它包含的內(nèi)容就是完整的消息內(nèi)容,半消息和普
    通消息的唯一區(qū)別是玛追,在事務提交之前税课,對于消費者來說,這個消息是不可見的痊剖。
  • 半消息發(fā)送成功后韩玩,訂單系統(tǒng)就可以執(zhí)行本地事務了,在訂單庫中創(chuàng)建一條訂單記錄陆馁,并提
    交訂單庫的數(shù)據(jù)庫事務找颓。
  • 根據(jù)本地事務的執(zhí)行結(jié)果決定提交或者回滾事務消息。
    (1)如果訂單創(chuàng)建成功:
    那就提交事務消息叮贩,購物車系統(tǒng)就可以消費到這條消息繼續(xù)后續(xù)的流程击狮。
    (2)如果訂單創(chuàng)建失敗,那就回滾事務消息益老,購物車系統(tǒng)就不會收到這條消息彪蓬。

處理事務消息提交失敗 -- RocketMQ事務反查機制

在 RocketMQ 中的事務實現(xiàn)中,增加了事務反查的機制來解決事務消息提交失敗的問題捺萌。
如果 Producer 也就是訂單系統(tǒng)档冬,在提交或者回滾事務消息時發(fā)生網(wǎng)絡異常,RocketMQ
的 Broker 沒有收到提交或者回滾的請求,Broker 會定期去 Producer 上反查這個事務對
應的本地事務的狀態(tài)捣郊,然后根據(jù)反查結(jié)果決定提交或者回滾這個事務。
為了支撐這個事務反查機制慈参,我們的業(yè)務代碼需要實現(xiàn)一個反查本地事務狀態(tài)的接口呛牲,告知
RocketMQ 本地事務是成功還是失敗。
在我們這個例子中驮配,反查本地事務的邏輯也很簡單娘扩,我們只要根據(jù)消息中的訂單 ID,在訂
單庫中查詢這個訂單是否存在即可壮锻,如果訂單存在則返回成功琐旁,否則返回失敗。
RocketMQ 會自動根據(jù)事務反查的結(jié)果提交或者回滾事務消息猜绣。
這個反查本地事務的實現(xiàn)灰殴,并不依賴消息的發(fā)送方,也就是訂單服務的某個實例節(jié)點上的任
何數(shù)據(jù)掰邢。這種情況下牺陶,即使是發(fā)送事務消息的那個訂單服務節(jié)點宕機了,RocketMQ 依然
可以通過其他訂單服務的節(jié)點來執(zhí)行反查辣之,確保事務的完整性掰伸。

image.png
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怀估,隨后出現(xiàn)的幾起案子狮鸭,更是在濱河造成了極大的恐慌,老刑警劉巖多搀,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歧蕉,死亡現(xiàn)場離奇詭異,居然都是意外死亡康铭,警方通過查閱死者的電腦和手機廊谓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麻削,“玉大人蒸痹,你說我怎么就攤上這事∏河矗” “怎么了叠荠?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扫责。 經(jīng)常有香客問我榛鼎,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任者娱,我火速辦了婚禮抡笼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘黄鳍。我一直安慰自己推姻,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布框沟。 她就那樣靜靜地躺著藏古,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忍燥。 梳的紋絲不亂的頭發(fā)上拧晕,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音梅垄,去河邊找鬼厂捞。 笑死,一個胖子當著我的面吹牛队丝,可吹牛的內(nèi)容都是我干的蔫敲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼炭玫,長吁一口氣:“原來是場噩夢啊……” “哼奈嘿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吞加,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裙犹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后衔憨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叶圃,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年践图,在試婚紗的時候發(fā)現(xiàn)自己被綠了掺冠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡码党,死狀恐怖德崭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揖盘,我是刑警寧澤眉厨,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站兽狭,受9級特大地震影響憾股,放射性物質(zhì)發(fā)生泄漏鹿蜀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一服球、第九天 我趴在偏房一處隱蔽的房頂上張望茴恰。 院中可真熱鬧,春花似錦斩熊、人聲如沸往枣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婉商。三九已至似忧,卻和暖如春渣叛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盯捌。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工淳衙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饺著。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓箫攀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親幼衰。 傳聞我的和親對象是個殘疾皇子靴跛,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359