久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      總結(jié)分布式事務(wù)的7種解決方案(理論+方案)

      隨著業(yè)務(wù)的快速發(fā)展、業(yè)務(wù)復(fù)雜度越來(lái)越高,幾乎每個(gè)公司的系統(tǒng)都會(huì)從單體走向分布式,特別是轉(zhuǎn)向微服務(wù)架構(gòu)。隨之而來(lái)就必然遇到分布式事務(wù)這個(gè)難題。

      這篇文章首先介紹了相關(guān)的基礎(chǔ)理論,然后總結(jié)了最經(jīng)典的事務(wù)方案,最后給出了子事務(wù)亂序執(zhí)行(冪等、空補(bǔ)償、懸掛問(wèn)題)的解決方案,分享給大家。

      基礎(chǔ)理論

      在講解具體方案之前,我們先了解一下分布式事務(wù)所涉及到的基礎(chǔ)理論知識(shí)。

      我們拿轉(zhuǎn)賬作為例子,A需要轉(zhuǎn)100元給B,那么需要給A的余額-100元,給B的余額+100元,整個(gè)轉(zhuǎn)賬要保證,A-100和B+100同時(shí)成功,或者同時(shí)失敗??纯丛诟鞣N場(chǎng)景下,是如何解決這個(gè)問(wèn)題的。

      事務(wù)

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

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

      • Atomicity(原子性):一個(gè)事務(wù)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被恢復(fù)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣。
      • Consistency(一致性):在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞。完整性包括外鍵約束、應(yīng)用定義的等約束不會(huì)被破壞。
      • Isolation(隔離性):數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫(xiě)和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。
      • Durability(持久性):事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。

      假如我們的業(yè)務(wù)系統(tǒng)不復(fù)雜,可以在一個(gè)數(shù)據(jù)庫(kù)、一個(gè)服務(wù)內(nèi)對(duì)數(shù)據(jù)進(jìn)行修改,完成轉(zhuǎn)賬,那么,我們可以利用數(shù)據(jù)庫(kù)事務(wù),保證轉(zhuǎn)賬業(yè)務(wù)的正確完成。

      分布式事務(wù)

      銀行跨行轉(zhuǎn)賬業(yè)務(wù)是一個(gè)典型分布式事務(wù)場(chǎng)景,假設(shè)A需要跨行轉(zhuǎn)賬給B,那么就涉及兩個(gè)銀行的數(shù)據(jù),無(wú)法通過(guò)一個(gè)數(shù)據(jù)庫(kù)的本地事務(wù)保證轉(zhuǎn)賬的ACID,只能夠通過(guò)分布式事務(wù)來(lái)解決。

      分布式事務(wù)就是指事務(wù)的發(fā)起者、資源及資源管理器和事務(wù)協(xié)調(diào)者分別位于分布式系統(tǒng)的不同節(jié)點(diǎn)之上。在上述轉(zhuǎn)賬的業(yè)務(wù)中,用戶(hù)A-100操作和用戶(hù)B+100操作不是位于同一個(gè)節(jié)點(diǎn)上。本質(zhì)上來(lái)說(shuō),分布式事務(wù)就是為了保證在分布式場(chǎng)景下,數(shù)據(jù)操作的正確執(zhí)行。

      分布式事務(wù)在分布式環(huán)境下,為了滿(mǎn)足可用性、性能與降級(jí)服務(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é)果可見(jiàn)性允許安全放寬
      • 持久性:嚴(yán)格遵循

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

      由于分布式事務(wù)方案,無(wú)法做到完全的ACID的保證,沒(méi)有一種完美的方案,能夠解決掉所有業(yè)務(wù)問(wèn)題。因此在實(shí)際應(yīng)用中,會(huì)根據(jù)業(yè)務(wù)的不同特性,選擇最適合的分布式事務(wù)方案。

      兩階段提交/XA

      XA是由X/Open組織提出的分布式事務(wù)的規(guī)范,XA規(guī)范主要定義了(全局)事務(wù)管理器(TM)和(局部)資源管理器(RM)之間的接口。本地的數(shù)據(jù)庫(kù)如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命令。
      目前主流的數(shù)據(jù)庫(kù)基本都支持XA事務(wù),包括mysql、oracle、sqlserver、postgre

      XA 事務(wù)由一個(gè)或多個(gè)資源管理器(RM)、一個(gè)事務(wù)管理器(TM)和一個(gè)應(yīng)用程序(ApplicationProgram)組成。

      這里的RM、TM、AP三個(gè)角色是經(jīng)典的角色劃分,會(huì)貫穿后續(xù)Saga、Tcc等事務(wù)模式。

      把上面的轉(zhuǎn)賬作為例子,一個(gè)成功完成的XA事務(wù)時(shí)序圖如下:
      總結(jié)分布式事務(wù)的7種解決方案(理論+方案)

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

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

      • 簡(jiǎn)單易理解,開(kāi)發(fā)較容易
      • 對(duì)資源進(jìn)行了長(zhǎng)時(shí)間的鎖定,并發(fā)度低

      如果讀者想要進(jìn)一步研究XA,go語(yǔ)言以及PHP、Python、Java、C#、Node等都可參考DTM

      SAGA

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

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

      總結(jié)分布式事務(wù)的7種解決方案(理論+方案)

      Saga一旦到了Cancel階段,那么Cancel在業(yè)務(wù)邏輯上是不允許失敗了。如果因?yàn)榫W(wǎng)絡(luò)或者其他臨時(shí)故障,導(dǎo)致沒(méi)有返回成功,那么TM會(huì)不斷重試,直到Cancel返回成功。

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

      • 并發(fā)度高,不用像XA事務(wù)那樣長(zhǎng)期鎖定資源
      • 需要定義正常操作以及補(bǔ)償操作,開(kāi)發(fā)量比XA大
      • 一致性較弱,對(duì)于轉(zhuǎn)賬,可能發(fā)生A用戶(hù)已扣款,最后轉(zhuǎn)賬又失敗的情況

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

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

      如果讀者想要進(jìn)一步研究SAGA,可參考DTM,里面包括了SAGA成功、失敗回滾的例子,還包括各類(lèi)網(wǎng)絡(luò)異常的處理。

      TCC

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

      TCC分為3個(gè)階段

      • Try 階段:嘗試執(zhí)行,完成所有業(yè)務(wù)檢查(一致性), 預(yù)留必須業(yè)務(wù)資源(準(zhǔn)隔離性)
      • Confirm 階段:確認(rèn)執(zhí)行真正執(zhí)行業(yè)務(wù),不作任何業(yè)務(wù)檢查,只使用 Try 階段預(yù)留的業(yè)務(wù)資源,Confirm 操作要求具備冪等設(shè)計(jì),Confirm 失敗后需要進(jìn)行重試。
      • Cancel 階段:取消執(zhí)行,釋放 Try 階段預(yù)留的業(yè)務(wù)資源。Cancel 階段的異常和 Confirm 階段異常處理方案基本上一致,要求滿(mǎn)足冪等設(shè)計(jì)。

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

      總結(jié)分布式事務(wù)的7種解決方案(理論+方案)

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

      TCC特點(diǎn)如下:

      • 并發(fā)度較高,無(wú)長(zhǎng)期資源鎖定。
      • 開(kāi)發(fā)量較大,需要提供Try/Confirm/Cancel接口。
      • 一致性較好,不會(huì)發(fā)生SAGA已扣款最后又轉(zhuǎn)賬失敗的情況
      • TCC適用于訂單類(lèi)業(yè)務(wù),對(duì)中間狀態(tài)有約束的業(yè)務(wù)

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

      本地消息表

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

      大致流程如下:

      總結(jié)分布式事務(wù)的7種解決方案(理論+方案)

      寫(xiě)本地消息和業(yè)務(wù)操作放在一個(gè)事務(wù)里,保證了業(yè)務(wù)和發(fā)消息的原子性,要么他們?nèi)汲晒?,要么全都失敗?/p>

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

      • 扣減余額事務(wù) 失敗時(shí),事務(wù)直接回滾,無(wú)后續(xù)步驟
      • 輪序生產(chǎn)消息失敗, 增加余額事務(wù)失敗都會(huì)進(jìn)行重試

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

      • 長(zhǎng)事務(wù)僅需要分拆成多個(gè)任務(wù),使用簡(jiǎn)單
      • 生產(chǎn)者需要額外的創(chuàng)建消息表
      • 每個(gè)本地消息表都需要進(jìn)行輪詢(xún)
      • 消費(fèi)者的邏輯如果無(wú)法通過(guò)重試成功,那么還需要
      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)