架構(gòu)設(shè)計(jì)事務(wù)篇之分布式事務(wù)

概述

事務(wù)是一組讀寫操作坎穿,這些操作被當(dāng)作一個(gè)獨(dú)立的工作單元被執(zhí)行湘今,操作的執(zhí)行結(jié)果要么全部成功,要么全部失敗唉窃,不允許部分成功耙饰、部分失敗的情況出現(xiàn)。
事務(wù)可以分為本地事物和分布式事物纹份,本地事務(wù)的數(shù)據(jù)操作是在單個(gè)數(shù)據(jù)庫(kù)上執(zhí)行的苟跪,而分布式事務(wù)是在多個(gè)數(shù)據(jù)庫(kù)上執(zhí)行的廷痘,分布式事物由兩個(gè)或以上的本地事物構(gòu)成,它也被稱之為全局事物件已。
無(wú)論是本地事物笋额,還是分布式事物它們的作用都是為了保障數(shù)據(jù)的一致性。

實(shí)列

avatar

在采用微服務(wù)架構(gòu)的應(yīng)用程序中拨齐,需要使用分布式事務(wù)技術(shù)的典型實(shí)列是:當(dāng)訂單支付成功之后,需要同時(shí)跟新訂單狀態(tài)以及扣減庫(kù)存昨寞,而訂單數(shù)據(jù)和庫(kù)存數(shù)據(jù)位于不同的數(shù)據(jù)庫(kù)中瞻惋。
此時(shí),更新訂單狀態(tài)援岩、扣減庫(kù)存這兩個(gè)操作同屬一個(gè)事務(wù)歼狼,兩個(gè)操作作為一個(gè)執(zhí)行單元不能被分割,要么都執(zhí)行成功享怀,要么都執(zhí)行事物羽峰,不允許出現(xiàn)一個(gè)成功另一個(gè)失敗的情況。
但是添瓷,在分布式的架構(gòu)中梅屉,網(wǎng)絡(luò)抖動(dòng)、超時(shí)鳞贷、服務(wù)故障等異常都是不可避免的坯汤。
比如,當(dāng)上面的事物執(zhí)行時(shí)搀愧,可能訂單狀態(tài)的更新在訂單數(shù)據(jù)庫(kù)上執(zhí)行成功惰聂,但庫(kù)存的扣減因網(wǎng)絡(luò)原因在庫(kù)存數(shù)據(jù)庫(kù)中執(zhí)行失敗,這樣就造成了數(shù)據(jù)庫(kù)中的數(shù)據(jù)和我們期望的業(yè)務(wù)數(shù)據(jù)狀態(tài)不一致咱筛。

avatar

問(wèn)題

分布式事務(wù)是一組操作序列搓幌,序列中的任意操作都有可能因故障導(dǎo)致該操作執(zhí)行失敗,從而導(dǎo)致數(shù)據(jù)不一致迅箩。
又因?yàn)楦瘸睿收蠒?huì)發(fā)生在任意時(shí)刻而且是100%會(huì)發(fā)生,所以分布式的事務(wù)一定會(huì)出現(xiàn)事務(wù)不一致的情況饲趋,無(wú)論采用哪一種方案叉钥。
因此,我們的技術(shù)實(shí)現(xiàn)方案便面臨兩個(gè)核心問(wèn)題:第一篙贸、如何減少事務(wù)執(zhí)行時(shí)發(fā)生故障的概率投队,第二、故障發(fā)生后出現(xiàn)數(shù)據(jù)不一致的情況如何解決爵川。

方案

針對(duì)上面的第一個(gè)問(wèn)題敷鸦,可行的策略是在執(zhí)行事務(wù)之前,先確保網(wǎng)絡(luò)和數(shù)據(jù)庫(kù)都不存在故障,然后再開始執(zhí)行事務(wù)扒披。
2PC(兩階段)值依、3PC(三階段)、TCC采用的都是這種策略碟案,除了TCC在執(zhí)行失敗時(shí)會(huì)通過(guò)撤銷操作恢復(fù)數(shù)據(jù)的一致性外愿险,其它的方式在事務(wù)執(zhí)行失敗時(shí)都沒(méi)有任何的恢復(fù)策略,但TCC也不是絕對(duì)能保障數(shù)據(jù)會(huì)被恢復(fù)价说。
針對(duì)上面的第二個(gè)問(wèn)題辆亏,可行的策略便是在故障發(fā)生后,不斷地重試直至成功為主鳖目,或最大限度的保障其操作執(zhí)行成功扮叨;
基于消息的最終一致性方案便是采用這種策略,相較于上面"快速失敗"式的方案這種方案最大的問(wèn)題是:數(shù)據(jù)從不一致恢復(fù)到一致的狀態(tài)時(shí)领迈,中間間隔的時(shí)間可能會(huì)過(guò)長(zhǎng)彻磁。
下面我們分別介紹一下上面的幾種方案。

2PC(兩階段)
avatar

在兩階段事務(wù)中狸捅,有兩個(gè)角色:事務(wù)協(xié)調(diào)者衷蜓、資源管理者。
事務(wù)協(xié)調(diào)者負(fù)責(zé)控制全局事務(wù)中多個(gè)本地事務(wù)的執(zhí)行流程尘喝,它會(huì)將本地事務(wù)分發(fā)給對(duì)應(yīng)的資源管理器并觸發(fā)資源管理器執(zhí)行本地事務(wù)恍箭。

avatar

兩階段事務(wù)的執(zhí)行流程分成準(zhǔn)備和提交兩個(gè)階段:

第一階段,主要是確保各個(gè)資源管理器(數(shù)據(jù)庫(kù))處于正常狀態(tài)瞧省,所以扯夭,事務(wù)管理器會(huì)先"試探"資源管理器:"我開始事務(wù)了,你準(zhǔn)備一下鞍匾?"交洗,
如果資源管理器準(zhǔn)備就緒,那么它會(huì)告知事務(wù)管理器:"我準(zhǔn)備好了橡淑。"构拳,否則資源管理器便處于異常狀態(tài);等所有的資源管理器都有回應(yīng)無(wú)論是準(zhǔn)備就緒還是異常梁棠,事務(wù)處理流程便會(huì)進(jìn)入第二個(gè)階段置森。

第二階段,主要是根據(jù)第一階段事務(wù)的準(zhǔn)備結(jié)果來(lái)控制事務(wù)的流程符糊,如果第一階段中所有的事務(wù)都準(zhǔn)備就緒凫海,那么事務(wù)管理器便會(huì)通知資源管理器提交事務(wù),否則取消事務(wù)男娄。

兩階段的實(shí)現(xiàn)方式存在以下主要缺點(diǎn):

同步阻塞:各個(gè)本地事務(wù)的執(zhí)行會(huì)占用數(shù)據(jù)庫(kù)的連接資源行贪,連接的占用時(shí)長(zhǎng)相當(dāng)于整個(gè)事務(wù)的執(zhí)行時(shí)長(zhǎng)而不是單個(gè)本地事務(wù)的時(shí)長(zhǎng)漾稀。

協(xié)調(diào)者故障:協(xié)調(diào)者如果不是分布式的那么存在單點(diǎn)故障的問(wèn)題,如果協(xié)調(diào)者在第二階段故障建瘫,那么有可能導(dǎo)致數(shù)據(jù)不一致崭捍。

數(shù)據(jù)不一致:當(dāng)各個(gè)事務(wù)管理器收到提交指令后,便會(huì)將本地事務(wù)提交啰脚,但可能出現(xiàn)有些資源管理器在第二階段沒(méi)有收到提交指令殷蛇,那么此時(shí)就會(huì)造成數(shù)據(jù)不一致情況。

3PC(三階段)
avatar

三階段將事務(wù)的執(zhí)行流程分成詢問(wèn)橄浓、準(zhǔn)備粒梦、提交兩個(gè)階段,比兩階段多出來(lái)詢問(wèn)這個(gè)階段贮配,其它兩個(gè)階段都是相同的谍倦。
詢問(wèn)階段主要作用在于檢測(cè)網(wǎng)絡(luò)塞赂,數(shù)據(jù)庫(kù)是否正常泪勒,避免直接進(jìn)入準(zhǔn)備階段因網(wǎng)絡(luò)故障導(dǎo)致的后續(xù)的回滾操作。

TCC(柔性事務(wù))
avatar

TCC也是一種兩階段事務(wù)宴猾,它由第一階段的Try圆存,以及第二階段的Cancel、Commit操作構(gòu)成仇哆。
TCC相較于2PC沦辙、3PC以及最終一致性來(lái)說(shuō),它的特點(diǎn)是:面向具體業(yè)務(wù)操作的事務(wù)讹剔,而其它的分布式事務(wù)方案是面向數(shù)據(jù)操作的油讯。

假如,你有一筆訂單支付成功了延欠,現(xiàn)在需要同時(shí)更新訂單庫(kù)中訂單的狀態(tài)陌兑,以及扣減庫(kù)存庫(kù)中商品庫(kù)存;
那么由捎,你的訂單服務(wù)兔综、庫(kù)存服務(wù)需要向事務(wù)協(xié)調(diào)者提供類似于下面的這些操作:

訂單服務(wù),Try:插入訂單狀態(tài)更新記錄狞玛;Confirm:跟新訂單狀態(tài)软驰;Cancel:取消訂單跟新;

庫(kù)存服務(wù)心肪,Try:鎖定庫(kù)存锭亏;Confirm:扣減庫(kù)存;Cancel:撤銷庫(kù)存更新硬鞍;

TCC這種處理方式因?yàn)橐蕾嚇I(yè)務(wù)操作來(lái)保障一致性贰镣,所以需要針對(duì)特定的事務(wù)編寫業(yè)務(wù)接口呜象。

最終一致性

最終一致性方案常見(jiàn)的方案有兩種,分別是基于本地消息表的事務(wù)碑隆、基于消息中間件的事務(wù)恭陡,雖然它們?cè)趯?shí)現(xiàn)上略微有所差異但基本原理還是一樣的,都采用異步非阻塞和重試技術(shù)來(lái)實(shí)現(xiàn)的上煤,而且業(yè)務(wù)接口都需要支持冪等休玩。

基于本地消息表
avatar

基于本地消息表的最終一致性方案,其實(shí)現(xiàn)原理是將分布式轉(zhuǎn)化成本地事務(wù)——將外部的本地事務(wù)轉(zhuǎn)化成一條消息劫狠,然后通過(guò)定時(shí)任務(wù)或消息中間件將消息發(fā)送出去拴疤。

基于消息中間件
avatar

基于消息中間件的最終一致性方案相較于基于本地消息表的事務(wù),省去了本地消息表独泞、定時(shí)任務(wù)呐矾、重試,這些操作都由消息中間實(shí)現(xiàn)了懦砂。

總結(jié)

無(wú)論那種分布式事務(wù)實(shí)現(xiàn)方案都無(wú)法絕對(duì)保障數(shù)據(jù)的一致性蜒犯,實(shí)現(xiàn)上的差別主要在數(shù)據(jù)不一致的時(shí)間長(zhǎng)短、強(qiáng)弱上荞膘。

擴(kuò)展閱讀

架構(gòu)設(shè)計(jì)思維篇之結(jié)構(gòu)

架構(gòu)設(shè)計(jì)思維篇之概念

架構(gòu)設(shè)計(jì)容錯(cuò)篇之重試

架構(gòu)設(shè)計(jì)容錯(cuò)篇之熔斷

架構(gòu)設(shè)計(jì)容錯(cuò)篇之限流

架構(gòu)設(shè)計(jì)事務(wù)篇之Mysql事務(wù)原理

架構(gòu)設(shè)計(jì)事務(wù)篇之CAP定理

架構(gòu)設(shè)計(jì)事務(wù)篇之分布式事務(wù)

架構(gòu)設(shè)計(jì)消息篇之消息丟失

架構(gòu)設(shè)計(jì)消息篇之保證消息順序性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罚随,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子羽资,更是在濱河造成了極大的恐慌淘菩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屠升,死亡現(xiàn)場(chǎng)離奇詭異潮改,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)腹暖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門汇在,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人微服,你說(shuō)我怎么就攤上這事趾疚。” “怎么了以蕴?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵糙麦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丛肮,道長(zhǎng)赡磅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任宝与,我火速辦了婚禮焚廊,結(jié)果婚禮上冶匹,老公的妹妹穿的比我還像新娘。我一直安慰自己咆瘟,他們只是感情好嚼隘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袒餐,像睡著了一般飞蛹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灸眼,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天卧檐,我揣著相機(jī)與錄音,去河邊找鬼焰宣。 笑死霉囚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匕积。 我是一名探鬼主播盈罐,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼闸天!你這毒婦竟也來(lái)了暖呕?” 一聲冷哼從身側(cè)響起斜做,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苞氮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瓤逼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笼吟,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年霸旗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贷帮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诱告,死狀恐怖撵枢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情精居,我是刑警寧澤锄禽,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站靴姿,受9級(jí)特大地震影響沃但,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佛吓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一宵晚、第九天 我趴在偏房一處隱蔽的房頂上張望垂攘。 院中可真熱鬧,春花似錦淤刃、人聲如沸晒他。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仪芒。三九已至,卻和暖如春耕陷,著一層夾襖步出監(jiān)牢的瞬間掂名,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工哟沫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饺蔑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓嗜诀,卻偏偏與公主長(zhǎng)得像猾警,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隆敢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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