分布式系統(tǒng)02——分布式事務(wù)解決方案

在上一篇文章中,我們已經(jīng)了解了分布式事務(wù)的定義,本文我們將了解常用的分布式事務(wù)解決方案。關(guān)注我的公眾號(hào)「Java面典」帅容,每天 10:24 和你一起了解更多 Java 相關(guān)知識(shí)點(diǎn)。

二階段提交

二階段提交(Two-phaseCommit)是指伍伤,在計(jì)算機(jī)網(wǎng)絡(luò)以及數(shù)據(jù)庫(kù)領(lǐng)域內(nèi)并徘,為了使基于分布式系統(tǒng)架構(gòu)下的所有節(jié)點(diǎn)在進(jìn)行事務(wù)提交時(shí)保持一致性而設(shè)計(jì)的一種算法(Algorithm)。通常扰魂,二階段提交也被稱為是一種協(xié)議(Protocol))麦乞。

在分布式系統(tǒng)中,每個(gè)節(jié)點(diǎn)雖然可以知曉自己的操作時(shí)成功或者失敗劝评,卻無(wú)法知道其他節(jié)點(diǎn)的操作的成功或失敗姐直。當(dāng)一個(gè)事務(wù)跨越多個(gè)節(jié)點(diǎn)時(shí),為了保持事務(wù)的 ACID 特性蒋畜,需要引入一個(gè)作為協(xié)調(diào)者的組件來(lái)統(tǒng)一掌控所有節(jié)點(diǎn)(稱作參與者)的操作結(jié)果声畏,并最終指示這些節(jié)點(diǎn)是否要把操作結(jié)果進(jìn)行真正的提交(比如將更新后的數(shù)據(jù)寫入磁盤等等)。

二階段提交的算法思路可以概括為:參與者將操作成敗通知協(xié)調(diào)者姻成,再由協(xié)調(diào)者根據(jù)所有參與者的反饋情報(bào)決定各參與者是否要提交操作還是中止操作插龄。

實(shí)現(xiàn)

  1. 準(zhǔn)備階段:事務(wù)協(xié)調(diào)者(事務(wù)管理器)給每個(gè)參與者(資源管理器))發(fā)送 Prepare 消息,每個(gè)參與者要么直接返回失斂普埂(如權(quán)限驗(yàn)證失斁巍),要么在本地執(zhí)行事務(wù)才睹,寫本地的 redo 和 undo 日志徘跪,但不提交。

  2. 提交階段:如果協(xié)調(diào)者收到了參與者的失敗消息或者超時(shí)琅攘,直接給每個(gè)參與者發(fā)送回滾(Rollback)消息真椿;否則,發(fā)送提交(Commit)消息乎澄;參與者根據(jù)協(xié)調(diào)者的指令執(zhí)行提交或者回滾操作突硝,釋放所有事務(wù)處理過(guò)程中使用的鎖資源(注意:必須在最后階段釋放鎖資源)。

缺點(diǎn)

  1. 同步阻塞問(wèn)題:執(zhí)行過(guò)程中置济,所有參與節(jié)點(diǎn)都是事務(wù)阻塞型的解恰;

  2. 單點(diǎn)故障:由于協(xié)調(diào)者的重要性,一旦協(xié)調(diào)者發(fā)生故障浙于。參與者會(huì)一直阻塞下去护盈;

  3. 數(shù)據(jù)不一致(腦裂問(wèn)題):在二階段提交的階段二中,當(dāng)協(xié)調(diào)者向參與者發(fā)送 commit 請(qǐng)求之后羞酗,發(fā)生了局部網(wǎng)絡(luò)異掣危或者在發(fā)送 commit 請(qǐng)求過(guò)程中協(xié)調(diào)者發(fā)生了故障,導(dǎo)致只有一部分參與者接受到了 commit 請(qǐng)求。于是整個(gè)分布式系統(tǒng)便出現(xiàn)了數(shù)據(jù)部一致性的現(xiàn)象(腦裂現(xiàn)象)胸竞;

  4. 二階段無(wú)法解決的問(wèn)題(數(shù)據(jù)狀態(tài)不確定):協(xié)調(diào)者再發(fā)出 commit 消息之后宕機(jī)欺嗤,而唯一接收到這條消息的參與者同時(shí)也宕機(jī)了。那么即使協(xié)調(diào)者通過(guò)選舉協(xié)議產(chǎn)生了新的協(xié)調(diào)者卫枝,這條事務(wù)的狀態(tài)也是不確定的煎饼,沒(méi)人知道事務(wù)是否被已經(jīng)提交。

三階段提交

三階段提交( Three-phase commit ) 校赤, 也 叫 三 階 段 提 交 協(xié) 議 ( Three-phase commit protocol)吆玖,是二階段提交(2PC)的改進(jìn)版本。
與兩階段提交不同的是马篮,三階段提交有兩個(gè)改動(dòng)點(diǎn):

  1. 引入超時(shí)機(jī)制沾乘。同時(shí)在協(xié)調(diào)者和參與者中都引入超時(shí)機(jī)制;

  2. 在第一階段和第二階段中插入一個(gè)準(zhǔn)備階段浑测。保證了在最后提交階段之前各參與節(jié)點(diǎn)的狀態(tài)是一致的意鲸。也就是說(shuō),除了引入超時(shí)機(jī)制之外尽爆,3PC 把 2PC 的準(zhǔn)備階段再次一分為二怎顾,這樣三階段提交就有 CanCommit、PreCommit漱贱、DoCommit 三個(gè)階段槐雾。

實(shí)現(xiàn)

  1. CanCommit 階段:協(xié)調(diào)者向參與者發(fā)送 commit 請(qǐng)求,參與者如果可以提交就返回 Yes 響應(yīng)幅狮,否則返回 No 響應(yīng)募强;

  2. PreCommit 階段:協(xié)調(diào)者根據(jù)參與者的反應(yīng)情況來(lái)決定是否可以繼續(xù)進(jìn)行,有以下兩種可能崇摄。假如協(xié)調(diào)者從所有的參與者獲得的反饋都是 Yes 響應(yīng)擎值,那么就會(huì)執(zhí)行事務(wù)的預(yù)執(zhí)行假如有任何一個(gè)參與者向協(xié)調(diào)者發(fā)送了 No 響應(yīng),或者等待超時(shí)之后逐抑,協(xié)調(diào)者都沒(méi)有接到參與者的響應(yīng)鸠儿,那么就執(zhí)行事務(wù)的中斷;

  3. DoCommit 階段:該階段進(jìn)行真正的事務(wù)提交厕氨,主要包含:
    1). 協(xié)調(diào)者發(fā)送提交請(qǐng)求进每;
    2). 參與者提交事務(wù);
    3). 參與者響應(yīng)反饋( 事務(wù)提交完之后命斧,向協(xié)調(diào)者發(fā)送 Ack 響應(yīng)田晚。)
    4). 協(xié)調(diào)者確定完成事務(wù)。

柔性事務(wù)

在電商領(lǐng)域等互聯(lián)網(wǎng)場(chǎng)景下国葬,傳統(tǒng)的事務(wù)在數(shù)據(jù)庫(kù)性能和處理能力上都暴露出了瓶頸贤徒。在分布式領(lǐng)域基于 CAP 理論以及 BASE 理論芹壕,有人就提出了 柔性事務(wù) 的概念。CAP(一致性接奈、可用性踢涌、分區(qū)容忍性)理論大家都理解很多次了,這里不再敘述鲫趁。說(shuō)一下 BASE 理論斯嚎,它是在 CAP 理論的基礎(chǔ)之上的延伸利虫。包括 基本可用(Basically Available)挨厚、柔性狀態(tài)(Soft State)、最終一致性(Eventual Consistency)糠惫。通常所說(shuō)的柔性事務(wù)分為:兩階段型疫剃、補(bǔ)償型、異步確保型硼讽、最大努力通知型幾種巢价。

兩階段型

就是分布式事務(wù)兩階段提交,對(duì)應(yīng)技術(shù)上的 XA固阁、JTA/JTS壤躲。這是分布式環(huán)境下事務(wù)處理的
典型模式。

補(bǔ)償型

TCC 型事務(wù)(Try/Confirm/Cancel)可以歸為補(bǔ)償型备燃。

WS-BusinessActivity 提供了一種基于補(bǔ)償?shù)?long-running 的事務(wù)處理模型碉克。服務(wù)器 A 發(fā)起事務(wù),服務(wù)器 B 參與事務(wù)并齐,服務(wù)器 A 的事務(wù)如果執(zhí)行順利漏麦,那么事務(wù) A 就先行提交,如果事務(wù) B 也執(zhí)行順利况褪,則事務(wù) B 也提交撕贞,整個(gè)事務(wù)就算完成。但是如果事務(wù) B 執(zhí)行失敗测垛,事務(wù) B 本身回滾捏膨,這時(shí)事務(wù) A 已經(jīng)被提交,所以需要執(zhí)行一個(gè)補(bǔ)償操作食侮,將已經(jīng)提交的事務(wù) A 執(zhí)行的操作作反操作脊奋,恢復(fù)到未執(zhí)行前事務(wù) A 的狀態(tài)。這樣的 SAGA 事務(wù)模型疙描,是犧牲了一定的隔離性和一致性的诚隙,但是提高了 long-running 事務(wù)的可用性。

TCC.PNG

異步確保型

通過(guò)將一系列同步的事務(wù)操作變?yōu)榛谙?zhí)行的異步操作, 避免了分布式事務(wù)中的同步
阻塞操作的影響起胰。

異步確保型.PNG

最大努力通知型(多次嘗試)

這是分布式事務(wù)中要求最低的一種, 也可以通過(guò)消息中間件實(shí)現(xiàn), 與前面異步確保型操作不同的一點(diǎn)是, 在消息由 MQ Server 投遞到消費(fèi)者之后, 允許在達(dá)到最大重試次數(shù)之后正常結(jié)束事務(wù)久又。

分布式系統(tǒng)系列推薦

分布式系統(tǒng)01——什么是分布式事務(wù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巫延,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子地消,更是在濱河造成了極大的恐慌炉峰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脉执,死亡現(xiàn)場(chǎng)離奇詭異疼阔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)半夷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門婆廊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巫橄,你說(shuō)我怎么就攤上這事淘邻。” “怎么了湘换?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵宾舅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我彩倚,道長(zhǎng)筹我,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任帆离,我火速辦了婚禮蔬蕊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盯质。我一直安慰自己袁串,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布呼巷。 她就那樣靜靜地躺著囱修,像睡著了一般。 火紅的嫁衣襯著肌膚如雪王悍。 梳的紋絲不亂的頭發(fā)上破镰,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音压储,去河邊找鬼鲜漩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛集惋,可吹牛的內(nèi)容都是我干的孕似。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刮刑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼喉祭!你這毒婦竟也來(lái)了养渴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泛烙,失蹤者是張志新(化名)和其女友劉穎理卑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蔽氨,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藐唠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹉究。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宇立。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坊饶,靈堂內(nèi)的尸體忽然破棺而出泄伪,到底是詐尸還是另有隱情殴蓬,我是刑警寧澤匿级,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站染厅,受9級(jí)特大地震影響痘绎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肖粮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一孤页、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涩馆,春花似錦行施、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至涯雅,卻和暖如春鲜结,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背活逆。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工精刷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔗候。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓怒允,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锈遥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纫事,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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