<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分布式事務(wù)最經(jīng)典的七種解決方案

          共 6843字,需瀏覽 14分鐘

           ·

          2021-11-18 06:32

          上一篇:朝陽群眾盯上了望京A座?舉報(bào)996造成交通嚴(yán)重堵塞。996將成歷史?
          作者:葉東富

          來源:segmentfault.com/a/1190000040321750

          隨著業(yè)務(wù)的快速發(fā)展、業(yè)務(wù)復(fù)雜度越來越高,幾乎每個(gè)公司的系統(tǒng)都會從單體走向分布式,特別是轉(zhuǎn)向微服務(wù)架構(gòu)。隨之而來就必然遇到分布式事務(wù)這個(gè)難題,這篇文章總結(jié)了分布式事務(wù)最經(jīng)典的解決方案,分享給大家。

          ◆  基礎(chǔ)理論

          在講解具體方案之前,我們先了解一下分布式事務(wù)所涉及到的基礎(chǔ)理論知識。
          我們拿轉(zhuǎn)賬作為例子,A需要轉(zhuǎn)100元給B,那么需要給A的余額-100元,給B的余額+100元,整個(gè)轉(zhuǎn)賬要保證,A-100和B+100同時(shí)成功,或者同時(shí)失敗。看看在各種場景下,是如何解決這個(gè)問題的。

          ◆  事務(wù)

          把多條語句作為一個(gè)整體進(jìn)行操作的功能,被稱為數(shù)據(jù)庫事務(wù)。數(shù)據(jù)庫事務(wù)可以確保該事務(wù)范圍內(nèi)的所有操作都可以全部成功或者全部失敗。

          事務(wù)具有 4 個(gè)屬性:原子性、一致性、隔離性、持久性。這四個(gè)屬性通常稱為 ACID 特性。

            分布式事務(wù)

          銀行跨行轉(zhuǎn)賬業(yè)務(wù)是一個(gè)典型分布式事務(wù)場景,假設(shè)A需要跨行轉(zhuǎn)賬給B,那么就涉及兩個(gè)銀行的數(shù)據(jù),無法通過一個(gè)數(shù)據(jù)庫的本地事務(wù)保證轉(zhuǎn)賬的ACID,只能夠通過分布式事務(wù)來解決。
          分布式事務(wù)就是指事務(wù)的發(fā)起者、資源及資源管理器和事務(wù)協(xié)調(diào)者分別位于分布式系統(tǒng)的不同節(jié)點(diǎn)之上。在上述轉(zhuǎn)賬的業(yè)務(wù)中,用戶A-100操作和用戶B+100操作不是位于同一個(gè)節(jié)點(diǎn)上。本質(zhì)上來說,分布式事務(wù)就是為了保證在分布式場景下,數(shù)據(jù)操作的正確執(zhí)行。搜索公眾號互聯(lián)網(wǎng)架構(gòu)回復(fù)“2T”,送你一份驚喜禮包。
          分布式事務(wù)在分布式環(huán)境下,為了滿足可用性、性能與降級服務(wù)的需要,降低一致性與隔離性的要求,一方面遵循 BASE 理論(BASE相關(guān)理論,涉及內(nèi)容非常多,感興趣的同學(xué),可以參考BASE理論):
          基本業(yè)務(wù)可用性(Basic Availability)
          柔性狀態(tài)(Soft state)
          最終一致性(Eventual consistency)
          同樣的,分布式事務(wù)也部分遵循 ACID 規(guī)范:
          原子性:嚴(yán)格遵循
          一致性:事務(wù)完成后的一致性嚴(yán)格遵循;事務(wù)中的一致性可適當(dāng)放寬
          隔離性:并行事務(wù)間不可影響;事務(wù)中間結(jié)果可見性允許安全放寬
          持久性:嚴(yán)格遵循

          ◆  分布式事務(wù)的解決方案

          ◆  兩階段提交/XA

          XA是由X/Open組織提出的分布式事務(wù)的規(guī)范,XA規(guī)范主要定義了(全局)事務(wù)管理器(TM)和(局部)資源管理器(RM)之間的接口。本地的數(shù)據(jù)庫如mysql在XA中扮演的是RM角色

          XA一共分為兩階段:

          第一階段(prepare):即所有的參與者RM準(zhǔn)備執(zhí)行事務(wù)并鎖住需要的資源。參與者ready時(shí),向TM報(bào)告已準(zhǔn)備就緒。
          第二階段 (commit/rollback):當(dāng)事務(wù)管理者(TM)確認(rèn)所有參與者(RM)都ready后,向所有參與者發(fā)送commit命令。搜索公眾號互聯(lián)網(wǎng)架構(gòu)回復(fù)“2T”,送你一份驚喜禮包。
          目前主流的數(shù)據(jù)庫基本都支持XA事務(wù),包括mysql、oracle、sqlserver、postgre
          XA 事務(wù)由一個(gè)或多個(gè)資源管理器(RM)、一個(gè)事務(wù)管理器(TM)和一個(gè)應(yīng)用程序(ApplicationProgram)組成。

          把上面的轉(zhuǎn)賬作為例子,一個(gè)成功完成的XA事務(wù)時(shí)序圖如下:


          如果有任何一個(gè)參與者prepare失敗,那么TM會通知所有完成prepare的參與者進(jìn)行回滾。

          XA事務(wù)的特點(diǎn)是:

          如果讀者想要進(jìn)一步研究XA,go語言可參考DTM,java語言可參考seata

          ◆  SAGA

          Saga是這一篇數(shù)據(jù)庫論文saga提到的一個(gè)方案。其核心思想是將長事務(wù)拆分為多個(gè)本地短事務(wù),由Saga事務(wù)協(xié)調(diào)器協(xié)調(diào),如果正常結(jié)束那就正常完成,如果某個(gè)步驟失敗,則根據(jù)相反順序一次調(diào)用補(bǔ)償操作。

          把上面的轉(zhuǎn)賬作為例子,一個(gè)成功完成的SAGA事務(wù)時(shí)序圖如下:



          SAGA事務(wù)的特點(diǎn):

          論文里面的SAGA內(nèi)容較多,包括兩種恢復(fù)策略,包括分支事務(wù)并發(fā)執(zhí)行,我們這里的討論,僅包括最簡單的SAGA

          SAGA適用的場景較多,長事務(wù)適用,對中間結(jié)果不敏感的業(yè)務(wù)場景適用

          如果讀者想要進(jìn)一步研究SAGA,go語言可參考DTM,java語言可參考seata

          ◆  TCC

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

          TCC分為3個(gè)階段

          把上面的轉(zhuǎn)賬作為例子,通常會在Try里面凍結(jié)金額,但不扣款,Confirm里面扣款,Cancel里面解凍金額,一個(gè)成功完成的TCC事務(wù)時(shí)序圖如下:



          TCC的Confirm/Cancel階段在業(yè)務(wù)邏輯上是不允許返回失敗的,如果因?yàn)榫W(wǎng)絡(luò)或者其他臨時(shí)故障,導(dǎo)致不能返回成功,TM會不斷的重試,直Confirm/Cancel返回成功。

          TCC特點(diǎn)如下:


          如果讀者想要進(jìn)一步研究TCC,go語言可參考DTM,java語言可參考seata

          ◆  本地消息表

          本地消息表這個(gè)方案最初是 ebay 架構(gòu)師 Dan Pritchett 在 2008 年發(fā)表給 ACM 的文章。設(shè)計(jì)核心是將需要分布式處理的任務(wù)通過消息的方式來異步確保執(zhí)行。

          大致流程如下:

          寫本地消息和業(yè)務(wù)操作放在一個(gè)事務(wù)里,保證了業(yè)務(wù)和發(fā)消息的原子性,要么他們?nèi)汲晒Γ慈际 ?/span>

          搜索公眾號互聯(lián)網(wǎng)架構(gòu)師后臺回復(fù)“2T”,獲取一份驚喜禮包。

          容錯(cuò)機(jī)制:

          本地消息表的特點(diǎn):

          適用于可異步執(zhí)行的業(yè)務(wù),且后續(xù)操作無需回滾的業(yè)務(wù)

          ◆  事務(wù)消息

          在上述的本地消息表方案中,生產(chǎn)者需要額外創(chuàng)建消息表,還需要對本地消息表進(jìn)行輪詢,業(yè)務(wù)負(fù)擔(dān)較重。阿里開源的RocketMQ 4.3之后的版本正式支持事務(wù)消息,該事務(wù)消息本質(zhì)上是把本地消息表放到RocketMQ上,解決生產(chǎn)端的消息發(fā)送與本地事務(wù)執(zhí)行的原子性問題。

          事務(wù)消息發(fā)送及提交:

          正常發(fā)送的流程圖如下:


          補(bǔ)償流程:

          對沒有Commit/Rollback的事務(wù)消息(pending狀態(tài)的消息),從服務(wù)端發(fā)起一次“回查”
          Producer收到回查消息,返回消息對應(yīng)的本地事務(wù)的狀態(tài),為Commit或者Rollback
          事務(wù)消息方案與本地消息表機(jī)制非常類似,區(qū)別主要在于原先相關(guān)的本地表操作替換成了一個(gè)反查接口

          事務(wù)消息特點(diǎn)如下:

          適用于可異步執(zhí)行的業(yè)務(wù),且后續(xù)操作無需回滾的業(yè)務(wù)

          如果讀者想要進(jìn)一步研究事務(wù)消息,可參考rocketmq,為了方便大家學(xué)習(xí)事務(wù)消息,DTM也提供了簡單實(shí)現(xiàn)

          ◆  最大努力通知

          發(fā)起通知方通過一定的機(jī)制最大努力將業(yè)務(wù)處理結(jié)果通知到接收方。具體包括:
          有一定的消息重復(fù)通知機(jī)制。因?yàn)榻邮胀ㄖ娇赡軟]有接收到通知,此時(shí)要有一定的機(jī)制對消息重復(fù)通知。
          消息校對機(jī)制。如果盡最大努力也沒有通知到接收方,或者接收方消費(fèi)消息后要再次消費(fèi),此時(shí)可由接收方主動向通知方查詢消息信息來滿足需求。
          前面介紹的的本地消息表和事務(wù)消息都屬于可靠消息,與這里介紹的最大努力通知有什么不同?
          可靠消息一致性,發(fā)起通知方需要保證將消息發(fā)出去,并且將消息發(fā)到接收通知方,消息的可靠性關(guān)鍵由發(fā)起通知方來保證。
          最大努力通知,發(fā)起通知方盡最大的努力將業(yè)務(wù)處理結(jié)果通知為接收通知方,但是可能消息接收不到,此時(shí)需要接收通知方主動調(diào)用發(fā)起通知方的接口查詢業(yè)務(wù)處理結(jié)果,通知的可靠性關(guān)鍵在接收通知方。

          解決方案上,最大努力通知需要:

          最大努力通知適用于業(yè)務(wù)通知類型,例如微信交易的結(jié)果,就是通過最大努力通知方式通知各個(gè)商戶,既有回調(diào)通知,也有交易查詢接口

          ◆  AT事務(wù)模式

          這是阿里開源項(xiàng)目seata中的一種事務(wù)模式,在螞蟻金服也被稱為FMT。優(yōu)點(diǎn)是該事務(wù)模式使用方式,類似XA模式,業(yè)務(wù)無需編寫各類補(bǔ)償操作,回滾由框架自動完成,缺點(diǎn)也類似AT,存在較長時(shí)間的鎖,不滿足高并發(fā)的場景。有興趣的同學(xué)可以參考seata-AT

          ◆  分布式事務(wù)中的網(wǎng)絡(luò)異常

          在分布式事務(wù)的各個(gè)環(huán)節(jié)都有可能出現(xiàn)網(wǎng)絡(luò)以及業(yè)務(wù)故障等問題,這些問題需要分布式事務(wù)的業(yè)務(wù)方做到防空回滾,冪等,防懸掛三個(gè)特性,下面以TCC事務(wù)說明這些異常情況:

          空回滾:

          在沒有調(diào)用 TCC 資源 Try 方法的情況下,調(diào)用了二階段的 Cancel 方法,Cancel 方法需要識別出這是一個(gè)空回滾,然后直接返回成功。

          出現(xiàn)原因是當(dāng)一個(gè)分支事務(wù)所在服務(wù)宕機(jī)或網(wǎng)絡(luò)異常,分支事務(wù)調(diào)用記錄為失敗,這個(gè)時(shí)候其實(shí)是沒有執(zhí)行Try階段,當(dāng)故障恢復(fù)后,分布式事務(wù)進(jìn)行回滾則會調(diào)用二階段的Cancel方法,從而形成空回滾。

          冪等

          由于任何一個(gè)請求都可能出現(xiàn)網(wǎng)絡(luò)異常,出現(xiàn)重復(fù)請求,所以所有的分布式事務(wù)分支,都需要保證冪等性

          懸掛:

          懸掛就是對于一個(gè)分布式事務(wù),其二階段 Cancel 接口比 Try 接口先執(zhí)行。

          出現(xiàn)原因是在 RPC 調(diào)用分支事務(wù)try時(shí),先注冊分支事務(wù),再執(zhí)行RPC調(diào)用,如果此時(shí) RPC 調(diào)用的網(wǎng)絡(luò)發(fā)生擁堵,RPC 超時(shí)以后,TM就會通知RM回滾該分布式事務(wù),可能回滾完成后,RPC 請求才到達(dá)參與者真正執(zhí)行。

          下面看一個(gè)網(wǎng)絡(luò)異常的時(shí)序圖,更好的理解上述幾種問題


          業(yè)務(wù)處理請求4的時(shí)候,Cancel在Try之前執(zhí)行,需要處理空回滾
          業(yè)務(wù)處理請求6的時(shí)候,Cancel重復(fù)執(zhí)行,需要冪等
          業(yè)務(wù)處理請求8的時(shí)候,Try在Cancel后執(zhí)行,需要處理懸掛

          面對上述復(fù)雜的網(wǎng)絡(luò)異常情況,目前看到各家建議的方案都是業(yè)務(wù)方通過唯一鍵,去查詢相關(guān)聯(lián)的操作是否已完成,如果已完成則直接返回成功。相關(guān)的判斷邏輯較復(fù)雜,易出錯(cuò),業(yè)務(wù)負(fù)擔(dān)重。

          在項(xiàng)目DTM中,出現(xiàn)了一種子事務(wù)屏障技術(shù),使用該技術(shù),能夠達(dá)到這個(gè)效果,看示意圖:


          所有這些請求,到了子事務(wù)屏障后:不正常的請求,會被過濾;正常請求,通過屏障。開發(fā)者使用子事務(wù)屏障之后,前面所說的各種異常全部被妥善處理,業(yè)務(wù)開發(fā)人員只需要關(guān)注實(shí)際的業(yè)務(wù)邏輯,負(fù)擔(dān)大大降低。
          子事務(wù)屏障提供了方法ThroughBarrierCall,方法的原型為:

          func ThroughBarrierCall(db *sql.DB, transInfo *TransInfo, busiCall BusiFunc)
          業(yè)務(wù)開發(fā)人員,在busiCall里面編寫自己的相關(guān)邏輯,調(diào)用該函數(shù)。ThroughBarrierCall保證,在空回滾、懸掛等場景下,busiCall不會被調(diào)用;在業(yè)務(wù)被重復(fù)調(diào)用時(shí),有冪等控制,保證只被提交一次。
          子事務(wù)屏障會管理TCC、SAGA、XA、事務(wù)消息等,也可以擴(kuò)展到其他領(lǐng)域
          子事務(wù)屏障技術(shù)的原理是,在本地?cái)?shù)據(jù)庫,建立分支事務(wù)狀態(tài)表sub_trans_barrier,唯一鍵為全局事務(wù)id-子事務(wù)id-子事務(wù)分支名稱(try|confirm|cancel)

          在此機(jī)制下,解決了網(wǎng)絡(luò)異常相關(guān)的問題

          對于SAGA事務(wù),也是類似的機(jī)制。

          子事務(wù)屏障技術(shù),為DTM首創(chuàng),它的意義在于設(shè)計(jì)簡單易實(shí)現(xiàn)的算法,提供了簡單易用的接口,在首創(chuàng),它的意義在于設(shè)計(jì)簡單易實(shí)現(xiàn)的算法,提供了簡單易用的接口,在這兩項(xiàng)的幫助下,開發(fā)人員徹底的從網(wǎng)絡(luò)異常的處理中解放出來。

          該技術(shù)目前需要搭配DTM事務(wù)管理器,目前SDK已經(jīng)提供給go語言的開發(fā)者。其他語言的sdk正在規(guī)劃中。對于其他的分布式事務(wù)框架,只要提供了合適的分布式事務(wù)信息,能夠按照上述原理,快速實(shí)現(xiàn)該技術(shù)。

          ◆  總結(jié)

          本文介紹了分布式事務(wù)的一些基礎(chǔ)理論,并對常用的分布式事務(wù)方案進(jìn)行了講解,在文章的后半部分還給出了事務(wù)異常的原因、分類以及優(yōu)雅的解決方案。

          感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。

              · END ·
          最后,關(guān)注公眾號互聯(lián)網(wǎng)架構(gòu)師,在后臺回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

          2.如何才能成為優(yōu)秀的架構(gòu)師?

          3.從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧

          4.程序員一般可以從什么平臺接私活?

          5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...

          6.IntelliJ IDEA 2019.3 首個(gè)最新訪問版本發(fā)布,新特性搶先看

          7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

          8.15張圖看懂瞎忙和高效的區(qū)別!


          瀏覽 29
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夫妻成人视频 | 亚洲欧美精品suv | 免费观看靠逼视频网战 | 做爰又粗又大又黄又硬 | 国产熟女在线视频 |