微服務(wù)下的分布式事務(wù)解決方案——Seata

我們在說到事務(wù)的時候搬味,總會以轉(zhuǎn)賬作為經(jīng)典案例:用戶下單買東西境氢,一次買賣過程會扣件庫存,生成訂單碰纬,扣減賬戶余額萍聊;在這樣的情況下,如果要保證數(shù)據(jù)業(yè)務(wù)的成功悦析,必須引入事務(wù)寿桨。不再贅述。
在事務(wù)案例里面强戴,我們的項目結(jié)構(gòu)是這樣的亭螟,Storage、Order骑歹、Account是一個服務(wù)里的三個功能模塊预烙,他們共同面對一個DB,這時候陵刹,啟用本地事務(wù)默伍,就可以實現(xiàn)三個操作的共同成功和共同失敗。


本地事務(wù)

然而衰琐,我們知道也糊,如果庫存、訂單羡宙、賬戶分別在不同的服務(wù)當(dāng)中狸剃,每個服務(wù)對應(yīng)自己的DB,那么本地事務(wù)就沒有辦法去限制和判斷其他操作是否一致性完成狗热。這就需要引入分布式事務(wù)钞馁。


分布式事務(wù)

分布式系統(tǒng)的三大原則:CAP

我們介紹解決方案之前,我們先介紹分布式系統(tǒng)的三大原則匿刮,也就是總會被提到的CAP定理:一致性(Consistency)僧凰、可用性(Availability)、分區(qū)容錯性(Partition tolerance)熟丸,分別解釋一下:
一致性:我們希望分布式系統(tǒng)中各個節(jié)點的數(shù)據(jù)能保證一致训措,這里的“一致”,對于主從數(shù)據(jù)庫來說是指主庫和從庫要保證數(shù)據(jù)一致。還是還有一層意思绩鸣,就是分布式系統(tǒng)任何時刻數(shù)據(jù)都是最新狀態(tài)怀大。比如我買了東西,接下來order和account返回的就是最新的狀態(tài)呀闻,我能從數(shù)據(jù)庫中直接查到化借;再比如我們剛對數(shù)據(jù)庫insert了一條數(shù)據(jù),立馬select捡多,我們希望從數(shù)據(jù)庫中返回的就是剛剛insert的數(shù)據(jù)蓖康。
如果我們要做到以上所說的,我們需要master向slave同步數(shù)據(jù)后局服,slave同步數(shù)據(jù)并鎖表(假設(shè)因為網(wǎng)絡(luò)原因同步需要一些時間)钓瞭,不對外開放讀的狀態(tài),直到slave數(shù)據(jù)修改成功后淫奔,解鎖。
可用性:與一致性不同堤结,所謂可用唆迁,就是每次訪問數(shù)據(jù)時都能夠得到數(shù)據(jù),不能返回錯誤和超時竞穷,這一點看起來就和保證一致性的時候同步有些沖突唐责,因為我們?yōu)榱艘恢滦缘面i表,可能就會導(dǎo)致延時瘾带。
分區(qū)容錯:分區(qū)容錯是我們使用分布式鼠哥,特別是主從復(fù)制時候的意義所在,它指的是其中一個結(jié)點掛了看政,不能使整個數(shù)據(jù)庫集群收到影響朴恳,其他服務(wù)還是可以正常運(yùn)行。
看了以上三個原則的特點允蚣,我們可以了解到于颖,CAP不能夠共存,如果需要每次返回都是最新數(shù)據(jù)嚷兔,那么就可能存在系統(tǒng)延時森渐,但是這又違反了可用性。但無論如何冒晰,分區(qū)容錯是必須保證的同衣,集群不能因為某一個結(jié)點的宕機(jī)而整個垮掉。那么所有的分布式解決方案壶运,也就是基于滿足AP或者CP來展開設(shè)計的耐齐。

還是基于上面的案例,我們來設(shè)計一個分布式事務(wù)解決方案:
拿Storage和Order舉例,既然業(yè)務(wù)上分成了兩個服務(wù)蚪缀,如果他們在各自的服務(wù)里面執(zhí)行數(shù)據(jù)操作后秫逝,告訴某一個中心操作結(jié)果,如果各自的事務(wù)提交都成功询枚,則整體成功违帆,如果其中有一個事務(wù)失敗,則一起回滾金蜀,這樣一來不就可以控制分布式事務(wù)了嗎刷后。


分布式事務(wù)管理

從上圖我們可以看到,全局的事務(wù)可以通過一個專門的服務(wù)——Transaction Manager(TM)進(jìn)行管理渊抄,它會去統(tǒng)計所有相關(guān)子事務(wù)的執(zhí)行情況尝胆,如果全部提交成功,對應(yīng)的全局事務(wù)正常結(jié)束就可以了(因為各個子事務(wù)已經(jīng)完成了提交任務(wù))护桦,如果其中有一個事務(wù)出現(xiàn)了問題含衔,我們可以根據(jù)每個子事務(wù)上的undo log進(jìn)行回滾,數(shù)據(jù)狀態(tài)修復(fù)二庵。
這其實就是Seata的實現(xiàn)原理:
在一次分布式事務(wù)中贪染,發(fā)起全局事務(wù)的服務(wù)會向Seata服務(wù)注冊一個全局事務(wù),這個全局事務(wù)會給各個子事務(wù)進(jìn)行關(guān)聯(lián):


Global Transaction

與我們之前自己臆想的分布式事務(wù)有點出入的是催享,Seata還定義了一個事務(wù)調(diào)度服務(wù):Transaction Coordinator(TC)它用來執(zhí)行TM的指令杭隙。
Seata執(zhí)行流程
  1. 發(fā)起全局事務(wù)的微服務(wù)會啟動一個全局事務(wù)的實例(TM),TM會告訴TC進(jìn)程“我要開啟全局事務(wù)了”因妙,這時候痰憎,TC會返回一個XID給該微服務(wù)。
  2. 得到XID后攀涵,該微服務(wù)上的資源管理器(Resource Manager)將子事務(wù)注冊到TC上铣耘,TC將該事務(wù)納入全局事務(wù)管理。
  3. 微服務(wù)開始執(zhí)行自己的本地事務(wù)汁果,比如新建一個order表數(shù)據(jù)涡拘。
  4. 隨著代碼邏輯的執(zhí)行,現(xiàn)在需要遠(yuǎn)程調(diào)用庫存微服務(wù)据德,去扣減庫存鳄乏,這時候這個全局的XID會一并傳給庫存服務(wù)上的TM,庫存上的MC就會在本地事務(wù)開啟之前向TC進(jìn)行子事務(wù)的注冊棘利,這樣庫存事務(wù)也被納入全局事務(wù)管理橱野。
  5. 庫存事務(wù)執(zhí)行完畢后,返回到訂單微服務(wù)善玫,這個時候水援,如果訂單事務(wù)也執(zhí)行完成,則由TM(TM存在于發(fā)起全局事務(wù)的服務(wù)中)告訴TC各個子事務(wù)的執(zhí)行情況,將提交或回滾的決議給到TC蜗元。
  6. TC根據(jù)全局事務(wù)-分支事務(wù)的映射關(guān)系執(zhí)行TM傳過來的決議或渤。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奕扣,隨后出現(xiàn)的幾起案子薪鹦,更是在濱河造成了極大的恐慌,老刑警劉巖惯豆,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件池磁,死亡現(xiàn)場離奇詭異,居然都是意外死亡楷兽,警方通過查閱死者的電腦和手機(jī)地熄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芯杀,“玉大人端考,你說我怎么就攤上這事”衲洌” “怎么了跛梗?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棋弥。 經(jīng)常有香客問我,道長诚欠,這世上最難降的妖魔是什么顽染? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮轰绵,結(jié)果婚禮上粉寞,老公的妹妹穿的比我還像新娘。我一直安慰自己左腔,他們只是感情好唧垦,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著液样,像睡著了一般振亮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞭莽,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天坊秸,我揣著相機(jī)與錄音,去河邊找鬼澎怒。 笑死褒搔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播星瘾,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼走孽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琳状?” 一聲冷哼從身側(cè)響起磕瓷,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎算撮,沒想到半個月后生宛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肮柜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年陷舅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片审洞。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡莱睁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芒澜,到底是詐尸還是另有隱情仰剿,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布痴晦,位于F島的核電站南吮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏誊酌。R本人自食惡果不足惜部凑,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碧浊。 院中可真熱鬧涂邀,春花似錦、人聲如沸箱锐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驹止。三九已至浩聋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幢哨,已是汗流浹背赡勘。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留捞镰,地道東北人闸与。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓毙替,卻偏偏與公主長得像,于是被迫代替她去往敵國和親践樱。 傳聞我的和親對象是個殘疾皇子厂画,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

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