08、分布式事務(wù)-Seata-TCC模式-上(理論基礎(chǔ)篇)

章節(jié)歸屬

分布式事務(wù)系列

1、背景

伴隨著高性能的分布式系統(tǒng)演進,我們必然會經(jīng)歷 通過橫向擴展節(jié)點 提高非熱點數(shù)據(jù)的并發(fā)性能杜秸;而橫向擴展節(jié)點實際是如下2方面的擴展變化:

  1. 擴展功能節(jié)點(對應(yīng)應(yīng)用的微服務(wù)化改造)
  2. 擴展數(shù)據(jù)節(jié)點(對應(yīng)增加數(shù)據(jù)分片)

這些變化自然就引發(fā) 原來調(diào)用一個服務(wù)的一個接口就完成的功能,現(xiàn)在需要協(xié)同調(diào)用多個服務(wù)的多個接口才能完成润绎。相信我們都遇到過因網(wǎng)絡(luò)撬碟、機器、程序等不可靠凡橱,引發(fā)的數(shù)據(jù)一致性的問題小作。而數(shù)據(jù)的一致性與系統(tǒng)的可擴展性和高可用同樣重要 是【基礎(chǔ)IT架構(gòu)】支撐業(yè)務(wù)高質(zhì)量轉(zhuǎn)型升級的重點也是難點亭姥。從螞蟻金服的分布事務(wù)產(chǎn)品十幾年的Roadmap可以看出其在數(shù)據(jù)一致性方面的堅持和不易(如今能快速使用他們的積累稼钩,幸甚至哉!)达罗,如下圖所示:

image.png

從官宣得知坝撑,螞蟻金服從微服務(wù)演進開始至今,大量的應(yīng)用采用了TCC事務(wù)模型粮揉,可能也是得益于:

  1. TCC模式關(guān)注功能擴展巡李,在按照功能橫向擴展資源時,解決微服務(wù)間調(diào)用的一致性問題扶认,保證多資源訪問的事務(wù)屬性侨拦。

  2. 在早期沒有現(xiàn)成成熟的分布式框架的條件下,其事務(wù)模型運轉(zhuǎn)在業(yè)務(wù)層辐宾,不依賴底層數(shù)據(jù)資源的事務(wù)支持狱从,能靈活應(yīng)對服務(wù)的拆分。

  3. 也可能跟2007年TCC概念的提出有重大關(guān)聯(lián)

2叠纹、起源

TCC(Try-Confirm-Cancel)的概念季研,最早是由 Pat Helland 于 2007 年發(fā)表的一篇名為《Life beyond Distributed Transactions:an Apostate’s Opinion》的論文提出。

3誉察、核心思想

其核心思想是是:通過對資源進行預(yù)留与涡,盡量減少對資源的鎖定時間;如果事務(wù)提交則完成對預(yù)留資源的確認持偏;如果事務(wù)回滾驼卖,則釋放預(yù)留的資源。

4鸿秆、角色和職責(zé)

4.1酌畜、服務(wù)實現(xiàn)3個方法

根據(jù)自己的業(yè)務(wù)場景服務(wù)實現(xiàn)3個自定義的方法,把服務(wù)納入到全局事務(wù)的管理中谬莹,3個方法概述如下:

  1. Try 方法:嘗試執(zhí)行檩奠;完成所有業(yè)務(wù)檢查(一致性), 預(yù)留必須業(yè)務(wù)資源(準隔離性)桩了。

  2. Confirm 方法:確認執(zhí)行真正執(zhí)行業(yè)務(wù),不作任何業(yè)務(wù)檢查埠戳,只使用 Try 階段預(yù)留的業(yè)務(wù)資源井誉,只要try成功,那么confirm就必須成功整胃;Confirm 操作要求具備冪等設(shè)計颗圣,Confirm 失敗后需要進行重試。

  3. Cancel 方法:取消執(zhí)行屁使,釋放 Try 階段預(yù)留的業(yè)務(wù)資源在岂。Cancel 階段的異常和 Confirm 階段異常處理方案基本上一致,要求滿足冪等設(shè)計蛮寂。

4.2蔽午、角色

Seata的實現(xiàn)中有3個重要角色

image.png
TC (Transaction Coordinator) - 事務(wù)協(xié)調(diào)者

維護全局和分支事務(wù)的狀態(tài),驅(qū)動全局事務(wù)提交或回滾酬蹋。

TM (Transaction Manager) - 事務(wù)管理器(發(fā)起方)

定義全局事務(wù)的范圍:開始全局事務(wù)及老、提交或回滾全局事務(wù)。

RM (Resource Manager) - 資源管理器(參與者)

提供TCC服務(wù)范抓,與TC交談以注冊分支事務(wù)和報告分支事務(wù)的狀態(tài)骄恶,并驅(qū)動分支事務(wù)提交或回滾。

4.3匕垫、二階段的職責(zé)分工
image.png
  1. 第一階段:
    要求服務(wù)提供方RM必須接受一些不確定因素僧鲁,在1階段所提供的邏輯操作是臨時性的操作(try操作),調(diào)用方TM保留了后續(xù)取消這些操作的權(quán)利象泵。

  2. 第二階段:

    • 如果調(diào)用方?jīng)Q策認為整個事務(wù)應(yīng)該回滾寞秃,會要求取消之前的臨時性操作,對應(yīng)的是提供方的的Cancel操作。
    • 如果調(diào)用方?jīng)Q策認為整個事務(wù)應(yīng)該提交单芜,會放棄取消的權(quán)利蜕该,對應(yīng)的是提供方的Confirm操作。

如轉(zhuǎn)賬作為例子洲鸠,通常會在Try里面凍結(jié)金額堂淡,但不扣款,Confirm里面扣款扒腕,Cancel里面解凍金額:

image.png

5绢淀、工作原理

5.1、整體架構(gòu)

Seata-TCC模式整體架構(gòu)如下圖所示:


image.png
5.2瘾腰、核心流程

Seata 框架管控整個事務(wù)皆的,業(yè)務(wù)只需要主動調(diào) Try 方法;TM 負責(zé)2件事情:1.發(fā)起全局事務(wù)蹋盆,2.提交或回滾全局事務(wù)到 TC费薄,然后TC 負責(zé)調(diào)用Confirm或Cancel的事(包括重試)硝全;核心流程如下:


image.png
  1. TM發(fā)起全局事務(wù)
  2. TM調(diào)用分支事務(wù)RM的try方法
  3. RM在Try 執(zhí)行前注冊分支事務(wù)到 TC
  4. RM在Try 執(zhí)行完后,上報事務(wù)狀態(tài)給 TC
  5. TM通知TC進行全局事務(wù)的提交或回滾
  6. TC調(diào)度楞抡,執(zhí)行分支事務(wù)RM的 Confirm 或 Cancel
5.3伟众、注意事項
  1. 空回滾
  • 場景:Try 未執(zhí)行,Cancel 執(zhí)行了
  • 原因:Try超時(丟包)了
  • 解決:當(dāng) TC 發(fā)現(xiàn)少了一個 Try召廷,那它就會回滾整個分布式事務(wù)凳厢,于是觸發(fā)了 Cancel,直接 Cancel 可能出現(xiàn)數(shù)據(jù)一致性問題竞慢,所以就要記錄 Try 是否執(zhí)行先紫,沒執(zhí)行就要做空回滾(啥都不做直接返回成功)。
  1. 防懸掛
  • 場景:Cancel 比 Try 先執(zhí)行
  • 原因:Try超時(阻塞)了
  • 解決:當(dāng) TC 發(fā)現(xiàn)少了一個 Try筹煮,那它就會回滾整個分布式事務(wù)遮精,于是觸發(fā)了 Cancel,然后擁堵的 Try 在 Cancel 處理完(空回滾)又來了寺谤,這時同樣要記錄下整個狀態(tài)仑鸥,要拒絕空回滾以后的 Try
  1. 冪等控制
  • 現(xiàn)象:超時重試吮播、補償都會導(dǎo)致 TCC 服務(wù)的 Try变屁、Confirm 或 Cancel 操作被重復(fù)執(zhí)行
  • 解決:Confirm 和 Cancel 開發(fā)時要考慮冪等控制(這是必須要做的)

6、總結(jié)

概括來看意狠,該模式有以下幾個特點:

  1. 該模式對代碼的嵌入性高粟关,開發(fā)工作較多,要求每個業(yè)務(wù)需要寫TCC三步驟的操作环戈。

  2. 無論有沒有本地事務(wù)控制都可以使用該模式闷板,與底層數(shù)據(jù)庫事務(wù)實現(xiàn)不相關(guān),這個事務(wù)模式是抽象的基于服務(wù)層的概念院塞,無論DB層是否有JDBC支持遮晚,即使沒有JDBC的支持如redis、mongo拦止、es等县遣,只要將對他們的操作包裝成TCC的參與者,就可以接入到TCC的事務(wù)范圍內(nèi)汹族。

  3. 并發(fā)度高萧求,無需長期資源鎖定,但并發(fā)問題顶瞒、數(shù)據(jù)的一致性問題夸政,需由開發(fā)者自行根據(jù)業(yè)務(wù)場景控制,開發(fā)要求高榴徐、難度偏大守问。

  4. 適用于訂單類業(yè)務(wù)匀归,可以有中間狀態(tài),但對中間狀態(tài)有約束的業(yè)務(wù)耗帕。

  5. 提供了更多的靈活性朋譬,因為是業(yè)務(wù)自主定義實現(xiàn),用戶可以借助2階段的提交過程兴垦,容易實現(xiàn)在特定場景下的自定義優(yōu)化和特殊功能開發(fā)徙赢。這個模式幾乎能滿足任何想要的事務(wù)場景,自定義補償性探越,自定義資源預(yù)留型事務(wù)狡赐,消息事務(wù)等場景。

參考


6.0 柔性事務(wù) :TCC兩階段補償型
分布式事務(wù)钦幔,阿里為什么鐘愛TCC
Seata-TCC模式 原理
第三篇-分布式事務(wù)之Seata-TCC和Saga模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枕屉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鲤氢,更是在濱河造成了極大的恐慌搀擂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卷玉,死亡現(xiàn)場離奇詭異哨颂,居然都是意外死亡,警方通過查閱死者的電腦和手機相种,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門威恼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寝并,你說我怎么就攤上這事箫措。” “怎么了衬潦?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵斤蔓,是天一觀的道長。 經(jīng)常有香客問我镀岛,道長弦牡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任哎媚,我火速辦了婚禮喇伯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拨与。我一直安慰自己稻据,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捻悯,像睡著了一般匆赃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上今缚,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天算柳,我揣著相機與錄音,去河邊找鬼姓言。 笑死瞬项,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的何荚。 我是一名探鬼主播囱淋,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼餐塘!你這毒婦竟也來了妥衣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤戒傻,失蹤者是張志新(化名)和其女友劉穎税手,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體需纳,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡芦倒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了候齿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熙暴。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖慌盯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掂器,我是刑警寧澤亚皂,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站国瓮,受9級特大地震影響灭必,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乃摹,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一禁漓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孵睬,春花似錦播歼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叭莫。三九已至,卻和暖如春烁试,著一層夾襖步出監(jiān)牢的瞬間雇初,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工减响, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留靖诗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓支示,卻偏偏與公主長得像呻畸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子悼院,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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