日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分布式事务不理解?一次给你讲清楚!

發(fā)布時(shí)間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式事务不理解?一次给你讲清楚! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

支付重構(gòu)

考慮支付重構(gòu)的時(shí)候,自然想到原本屬于一個(gè)本地事務(wù)中的處理,現(xiàn)在要跨應(yīng)用了要怎么處理。拿充值訂單舉個(gè)栗子吧,假設(shè):原本訂單模塊和賬戶模塊是放在一起的,現(xiàn)在需要做服務(wù)拆分,拆分成訂單服務(wù),賬戶服務(wù)。原本收到充值回調(diào)后,可以將修改訂單狀態(tài)和增加金幣放在一個(gè)mysql事務(wù)中完成的,但是呢,因?yàn)榉?wù)拆分了,就面臨著需要協(xié)調(diào)2個(gè)服務(wù)才能完成這個(gè)事務(wù)

所以就帶出來,我們今天要分享和討論的話題是:怎么解決分布式場景下數(shù)據(jù)一致性問題,暫且用分布式事務(wù)來定義吧。

同樣的問題還存在于其他的場景:

送禮:

  • 調(diào)用支付服務(wù):先扣送禮用戶的金幣,然后給主播加相應(yīng)的荔枝

  • 確認(rèn)第一步成功后,播放特效,發(fā)聊天室送禮評論等復(fù)制代碼

  • 充值成功消息:

  • 完成充值訂單

  • 發(fā)送訂單完成的kafka消息

  • 在涉及支付交易等付費(fèi)接口的時(shí)候,數(shù)據(jù)一致性的問題就顯得尤為重要,因?yàn)槎际清X啊

    目前分布式事務(wù)是怎么解決的呢?

    問題肯定不是新問題,也就是目前已經(jīng)有相應(yīng)的解決方案了,那就看一下現(xiàn)在是怎么來解決這類問題的吧。

    購買基礎(chǔ)商品成功發(fā)送支付訂單完成消息為例:

    假設(shè)支付下單購買基礎(chǔ)商品,此刻已經(jīng)收到支付回調(diào),訂單已經(jīng)處理成功了,這個(gè)時(shí)候kafka服務(wù)故障,消息發(fā)送失敗;而這個(gè)時(shí)候處理訂單的事務(wù)已經(jīng)提交了,么保證訂單完成的消息一定能發(fā)出去呢?

    解讀一下這個(gè)流程:

    綠色部分,表示流程正常運(yùn)行的交互過程:

  • 先往JobController中提交一個(gè)job(用于故障恢復(fù))

  • 提交成功后,開始處理訂單邏輯

  • 處理完訂單邏輯之后,開始發(fā)送kafka消息

  • 消息也發(fā)送成功后,刪除第一步提交的job

  • 黃色部分,表示流程出現(xiàn)了異常,數(shù)據(jù)可能存在不一致現(xiàn)象。這個(gè)時(shí)候就需要進(jìn)行流程恢復(fù)

  • JobController任務(wù)控制器定時(shí)去redis查詢延時(shí)任務(wù)列表(每個(gè)任務(wù)都有一個(gè)時(shí)間戳,按時(shí)間戳排序過濾)

  • 將任務(wù)進(jìn)行恢復(fù)(調(diào)用job注冊時(shí)定義的處理方法)

  • 任務(wù)執(zhí)行成功,表示流程完成;否則下一個(gè)定時(shí)周期重試

  • 問題:

  • 基于redis存儲(chǔ)恢復(fù)任務(wù),可能存在數(shù)據(jù)丟失風(fēng)險(xiǎn)

  • 架構(gòu)體系中沒有統(tǒng)一的分布式事務(wù)規(guī)范,可否將這層邏輯獨(dú)立為分布式事務(wù)中間件

  • 缺少事務(wù)執(zhí)行策略管理,如:控制最大重試次數(shù)等

  • 事務(wù)執(zhí)行狀態(tài)沒有記錄,追查需要去翻看日志

  • 行業(yè)中有什么解決方案

    說解決方案之前,我們先了解一下這些方案的理論依據(jù),有助于幫助我們來理解和實(shí)踐這些方案

    理論依據(jù)(討論的前提)

    本地事務(wù)、分布式事務(wù)

    如果說本地事務(wù)是解決單個(gè)數(shù)據(jù)源上的數(shù)據(jù)操作的一致性問題的話,那么分布式事務(wù)則是為了解決跨越多個(gè)數(shù)據(jù)源上數(shù)據(jù)操作的一致性問題。

    強(qiáng)一致性、弱一致性、最終一致性

    從客戶端角度,多進(jìn)程并發(fā)訪問時(shí),更新過的數(shù)據(jù)在不同進(jìn)程如何獲取的不同策略,決定了不同的一致性。對于關(guān)系型數(shù)據(jù)庫,要求更新過的數(shù)據(jù)能被后續(xù)的訪問都能看到,這是強(qiáng)一致性。如果能容忍后續(xù)的部分或者全部訪問不到,則是弱一致性。如果經(jīng)過一段時(shí)間后要求能訪問到更新后的數(shù)據(jù),則是最終一致性

    服務(wù)端角度,如何盡快將更新后的數(shù)據(jù)分布到整個(gè)系統(tǒng),降低達(dá)到最終一致性的時(shí)間窗口,是提高系統(tǒng)的可用度和用戶體驗(yàn)非常重要的方面。對于分布式數(shù)據(jù)系統(tǒng):

    • N — 數(shù)據(jù)復(fù)制的份數(shù)

    • W — 更新數(shù)據(jù)時(shí)需要保證寫完成的節(jié)點(diǎn)數(shù)

    • R — 讀取數(shù)據(jù)的時(shí)候需要讀取的節(jié)點(diǎn)數(shù)

    如果W+R>N,寫的節(jié)點(diǎn)和讀的節(jié)點(diǎn)重疊,則是強(qiáng)一致性。例如對于典型的一主一備同步復(fù)制的關(guān)系型數(shù)據(jù)庫,N=2,W=2,R=1,則不管讀的是主庫還是備庫的數(shù)據(jù),都是一致的。

    如果W+R<=N,則是弱一致性。例如對于一主一備異步復(fù)制的關(guān)系型數(shù)據(jù)庫,N=2,W=1,R=1,則如果讀的是備庫,就可能無法讀取主庫已經(jīng)更新過的數(shù)據(jù),所以是弱一致性。

    CAP理論

    分布式環(huán)境下(數(shù)據(jù)分布)要任何時(shí)刻保證數(shù)據(jù)一致性是不可能的,只能采取妥協(xié)的方案來保證數(shù)據(jù)最終一致性。這個(gè)也就是著名的CAP定理。

    需要明確的一點(diǎn)是,對于一個(gè)分布式系統(tǒng)而言,分區(qū)容錯(cuò)性是一個(gè)最基本的要求。因?yàn)?既然是一個(gè)分布式系統(tǒng),那么分布式系統(tǒng)中的組件必然需要被部署到不同的節(jié)點(diǎn),否則也就無所謂分布式系統(tǒng)了,因此必然出現(xiàn)子網(wǎng)絡(luò)。而對于分布式系統(tǒng)而言,網(wǎng) 絡(luò)問題又是一個(gè)必定會(huì)出現(xiàn)的異常情況,因此分區(qū)容錯(cuò)性也就成為了一個(gè)分布式系統(tǒng)必然需要面對和解決的問題。因此系統(tǒng)架構(gòu)師往往需要把精力花在如何根據(jù)業(yè)務(wù) 特點(diǎn)在C(一致性)和A(可用性)之間尋求平衡。

    BASE 理論

    BASE是Basically Available(基本可用)、Soft state(軟狀態(tài))和Eventually consistent(最終一致性)三個(gè)短語的縮寫。BASE理論是對CAP中一致性和可用性權(quán)衡的結(jié)果,其來源于對大規(guī)模互聯(lián)網(wǎng)系統(tǒng)分布式實(shí)踐的總結(jié), 是基于CAP定理逐步演化而來的。BASE理論的核心思想是:即使無法做到強(qiáng)一致性,但每個(gè)應(yīng)用都可以根據(jù)自身業(yè)務(wù)特點(diǎn),采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終一致性。

    BASE理論面向的是大型高可用可擴(kuò)展的分布式系統(tǒng),和傳統(tǒng)的事物ACID特性是相反的,它完全不同于ACID的強(qiáng)一致性模型,而是通過犧牲強(qiáng)一致性來獲得可用性,并允許數(shù)據(jù)在一段時(shí)間內(nèi)是不一致的,但最終達(dá)到一致狀態(tài)。但同時(shí),在實(shí)際的分布式場景中,不同業(yè)務(wù)單元和組件對數(shù)據(jù)一致性的要求是不同的,因此在具體的分布式系統(tǒng)架構(gòu)設(shè)計(jì)過程中,ACID特性和BASE理論往往又會(huì)結(jié)合在一起。

    柔性事務(wù)

    不同于ACID的剛性事務(wù),在分布式場景下基于BASE理論,就出現(xiàn)了柔性事務(wù)的概念。要想通過柔性事務(wù)來達(dá)到最終的一致性,就需要依賴于一些特性,這些特性在具體的方案中不一定都要滿足,因?yàn)椴煌姆桨敢蟛灰粯?#xff1b;但是都不滿足的話,是不可能做柔性事務(wù)的。

    可見性(對外可查詢)

    在分布式事務(wù)執(zhí)行過程中,如果某一個(gè)步驟執(zhí)行出錯(cuò),就需要明確的知道其他幾個(gè)操作的處理情況,這就需要其他的服務(wù)都能夠提供查詢接口,保證可以通過查詢來判斷操作的處理情況。

    為了保證操作的可查詢,需要對于每一個(gè)服務(wù)的每一次調(diào)用都有一個(gè)全局唯一的標(biāo)識(shí),可以是業(yè)務(wù)單據(jù)號(如訂單號)、也可以是系統(tǒng)分配的操作流水號(如支付記錄流水號)。除此之外,操作的時(shí)間信息也要有完整的記錄。

    冪等操作

    冪等性,其實(shí)是一個(gè)數(shù)學(xué)概念。冪等函數(shù),或冪等方法,是指可以使用相同參數(shù)重復(fù)執(zhí)行,并能獲得相同結(jié)果的函數(shù)。

    f(f(x)) = f(x)

    在編程中一個(gè)冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。也就是說,同一個(gè)方法,使用同樣的參數(shù),調(diào)用多次產(chǎn)生的業(yè)務(wù)結(jié)果與調(diào)用一次產(chǎn)生的業(yè)務(wù)結(jié)果相同。這一個(gè)要求其實(shí)也比較好理解,因?yàn)橐WC數(shù)據(jù)的最終一致性,很多解決防范都會(huì)有很多重試的操作,如果一個(gè)方法不保證冪等,那么將無法被重試。冪等操作的實(shí)現(xiàn)方式有多種,如在系統(tǒng)中緩存所有的請求與處理結(jié)果、檢測到重復(fù)操作后,直接返回上一次的處理結(jié)果等。

    業(yè)界方案

    兩階段提交(2PC)

    XA是X/Open CAE Specification (Distributed Transaction Processing)模型中定義的TM(Transaction Manager)與RM(Resource Manager)之間進(jìn)行通信的接口。

    在XA規(guī)范中,數(shù)據(jù)庫充當(dāng)RM角色,應(yīng)用需要充當(dāng)TM的角色,即生成全局的txId,調(diào)用XAResource接口,把多個(gè)本地事務(wù)協(xié)調(diào)為全局統(tǒng)一的分布式事務(wù)。

    二階段提交是XA的標(biāo)準(zhǔn)實(shí)現(xiàn)。它將分布式事務(wù)的提交拆分為2個(gè)階段:prepare和commit/rollback。

    2PC模型中,在prepare階段需要等待所有參與子事務(wù)的反饋,因此可能造成數(shù)據(jù)庫資源鎖定時(shí)間過長,不適合并發(fā)高以及子事務(wù)生命周長較長的業(yè)務(wù)場景。兩階段提交這種解決方案屬于犧牲了一部分可用性來換取的一致性。

    saga

    saga的提出,最早是為了解決可能會(huì)長時(shí)間運(yùn)行的分布式事務(wù)(long-running process)的問題。所謂long-running的分布式事務(wù),是指那些企業(yè)業(yè)務(wù)流程,需要跨應(yīng)用、跨企業(yè)來完成某個(gè)事務(wù),甚至在事務(wù)流程中還需要有手工操作的參與,這類事務(wù)的完成時(shí)間可能以分計(jì),以小時(shí)計(jì),甚至可能以天計(jì)。這類事務(wù)如果按照事務(wù)的ACID的要求去設(shè)計(jì),勢必造成系統(tǒng)的可用性大大的降低。試想一個(gè)由兩臺(tái)服務(wù)器一起參與的事務(wù),服務(wù)器A發(fā)起事務(wù),服務(wù)器B參與事務(wù),B的事務(wù)需要人工參與,所以處理時(shí)間可能很長。如果按照ACID的原則,要保持事務(wù)的隔離性、一致性,服務(wù)器A中發(fā)起的事務(wù)中使用到的事務(wù)資源將會(huì)被鎖定,不允許其他應(yīng)用訪問到事務(wù)過程中的中間結(jié)果,直到整個(gè)事務(wù)被提交或者回滾。這就造成事務(wù)A中的資源被長時(shí)間鎖定,系統(tǒng)的可用性將不可接受。

    saga,則是一種基于補(bǔ)償?shù)南Ⅱ?qū)動(dòng)的用于解決long-running process的一種解決方案。目標(biāo)是為了在確保系統(tǒng)高可用的前提下盡量確保數(shù)據(jù)的一致性。還是上面的例子,如果用saga來實(shí)現(xiàn),那就是這樣的流程:服務(wù)器A的事務(wù)先執(zhí)行,如果執(zhí)行順利,那么事務(wù)A就先行提交;如果提交成功,那么就開始執(zhí)行事務(wù)B,如果事務(wù)B也執(zhí)行順利,則事務(wù)B也提交,整個(gè)事務(wù)就算完成。但是如果事務(wù)B執(zhí)行失敗,那事務(wù)B本身需要回滾,這時(shí)因?yàn)槭聞?wù)A已經(jīng)提交,所以需要執(zhí)行一個(gè)補(bǔ)償操作,將已經(jīng)提交的事務(wù)A執(zhí)行的操作作反操作,恢復(fù)到未執(zhí)行前事務(wù)A的狀態(tài)。這樣的基于消息驅(qū)動(dòng)的實(shí)現(xiàn)思路,就是saga。我們可以看出,saga是犧牲了數(shù)據(jù)的強(qiáng)一致性,僅僅實(shí)現(xiàn)了最終一致性,但是提高了系統(tǒng)整體的可用性。

    補(bǔ)償事務(wù)(TCC)

    TCC 其實(shí)就是采用的補(bǔ)償機(jī)制,其核心思想是:針對每個(gè)操作,都要注冊一個(gè)與其對應(yīng)的確認(rèn)和補(bǔ)償(撤銷)操作。TCC模型是把鎖的粒度完全交給業(yè)務(wù)處理。它分為三個(gè)階段:

  • Try 階段主要是對業(yè)務(wù)系統(tǒng)做檢測及資源預(yù)留

  • Confirm 階段主要是對業(yè)務(wù)系統(tǒng)做確認(rèn)提交,Try階段執(zhí)行成功并開始執(zhí)行 Confirm階段時(shí),默認(rèn) Confirm階段是不會(huì)出錯(cuò)的。即:只要Try成功,Confirm一定成功。

  • Cancel 階段主要是在業(yè)務(wù)執(zhí)行錯(cuò)誤,需要回滾的狀態(tài)下執(zhí)行的業(yè)務(wù)取消,預(yù)留資源釋放。

  • 下面對TCC模式下,A賬戶往B賬戶匯款100元為例子,對業(yè)務(wù)的改造進(jìn)行詳細(xì)的分析:

    匯款服務(wù)和收款服務(wù)分別需要實(shí)現(xiàn),Try-Confirm-Cancel接口,并在業(yè)務(wù)初始化階段將其注入到TCC事務(wù)管理器中。、

    [匯款服務(wù)] Try:檢查A賬戶有效性,即查看A賬戶的狀態(tài)是否為“轉(zhuǎn)帳中”或者“凍結(jié)”;檢查A賬戶余額是否充足;從A賬戶中扣減100元,并將狀態(tài)置為“轉(zhuǎn)賬中”;預(yù)留扣減資源,將從A往B賬戶轉(zhuǎn)賬100元這個(gè)事件存入消息或者日志中; Confirm:不做任何操作; Cancel:A賬戶增加100元;從日志或者消息中,釋放扣減資源。[收款服務(wù)] Try:檢查B賬戶賬戶是否有效; Confirm:讀取日志或者消息,B賬戶增加100元;從日志或者消息中,釋放扣減資源; Cancel:不做任何操作。

    由此可以看出,TCC模型對業(yè)務(wù)的侵入強(qiáng),改造的難度大。

    本地消息表(異步確保)

    本地消息表這種實(shí)現(xiàn)方式應(yīng)該是業(yè)界使用最多的,其核心思想是將分布式事務(wù)拆分成本地事務(wù)進(jìn)行處理,這種思路是來源于ebay。我們可以從下面的流程圖中看出其中的一些細(xì)節(jié):

    基本思路就是:

    消息生產(chǎn)方,需要額外建一個(gè)消息表,并記錄消息發(fā)送狀態(tài)。消息表和業(yè)務(wù)數(shù)據(jù)要在一個(gè)事務(wù)里提交,也就是說他們要在一個(gè)數(shù)據(jù)庫里面。然后消息會(huì)經(jīng)過MQ發(fā)送到消息的消費(fèi)方。如果消息發(fā)送失敗,會(huì)進(jìn)行重試發(fā)送。

    消息消費(fèi)方,需要處理這個(gè)消息,并完成自己的業(yè)務(wù)邏輯。此時(shí)如果本地事務(wù)處理成功,表明已經(jīng)處理成功了,如果處理失敗,那么就會(huì)重試執(zhí)行。如果是業(yè)務(wù)上面的失敗,可以給生產(chǎn)方發(fā)送一個(gè)業(yè)務(wù)補(bǔ)償消息,通知生產(chǎn)方進(jìn)行回滾等操作。

    生產(chǎn)方和消費(fèi)方定時(shí)掃描本地消息表,把還沒處理完成的消息或者失敗的消息再發(fā)送一遍。如果有靠譜的自動(dòng)對賬補(bǔ)賬邏輯,這種方案還是非常實(shí)用的。

    事務(wù)消息

    事務(wù)消息作為一種異步確保型事務(wù), 將兩個(gè)事務(wù)分支通過MQ進(jìn)行異步解耦,事務(wù)消息的設(shè)計(jì)流程同樣借鑒了兩階段提交理論,整體交互流程如下圖所示:

  • 事務(wù)發(fā)起方首先發(fā)送prepare消息到MQ。

  • 在發(fā)送prepare消息成功后執(zhí)行本地事務(wù)。

  • 根據(jù)本地事務(wù)執(zhí)行結(jié)果返回commit或者是rollback。

  • 如果消息是rollback,MQ將刪除該prepare消息不進(jìn)行下發(fā),如果是commit消息,MQ將會(huì)把這個(gè)消息發(fā)送給consumer端。

  • 如果執(zhí)行本地事務(wù)過程中,執(zhí)行端掛掉,或者超時(shí),MQ將會(huì)不停的詢問其同組的其它producer來獲取狀態(tài)。

  • Consumer端的消費(fèi)成功機(jī)制有MQ保證。

  • 有一些第三方的MQ是支持事務(wù)消息的,比如RocketMQ,但是市面上一些主流的MQ都是不支持事務(wù)消息的,比如 RabbitMQ 和 Kafka 都不支持。

    盡最大努力通知

    最大努力通知方案主要也是借助MQ消息系統(tǒng)來進(jìn)行事務(wù)控制,這一點(diǎn)與可靠消息最終一致方案一樣。看來MQ中間件確實(shí)在一個(gè)分布式系統(tǒng)架構(gòu)中,扮演者重要的角色。最大努力通知方案是比較簡單的分布式事務(wù)方案,它本質(zhì)上就是通過定期校對,實(shí)現(xiàn)數(shù)據(jù)一致性。

    最大努力通知方案的實(shí)現(xiàn)

  • 業(yè)務(wù)活動(dòng)的主動(dòng)方,在完成業(yè)務(wù)處理之后,向業(yè)務(wù)活動(dòng)的被動(dòng)方發(fā)送消息,允許消息丟失。

  • 主動(dòng)方可以設(shè)置時(shí)間階梯型通知規(guī)則,在通知失敗后按規(guī)則重復(fù)通知,直到通知N次后不再通知。

  • 主動(dòng)方提供校對查詢接口給被動(dòng)方按需校對查詢,用于恢復(fù)丟失的業(yè)務(wù)消息。

  • 業(yè)務(wù)活動(dòng)的被動(dòng)方如果正常接收了數(shù)據(jù),就正常返回響應(yīng),并結(jié)束事務(wù)。

  • 如果被動(dòng)方?jīng)]有正常接收,根據(jù)定時(shí)策略,向業(yè)務(wù)活動(dòng)主動(dòng)方查詢,恢復(fù)丟失的業(yè)務(wù)消息

  • 最大努力通知方案的特點(diǎn)

  • 用到的服務(wù)模式:可查詢操作、冪等操作。

  • 被動(dòng)方的處理結(jié)果不影響主動(dòng)方的處理結(jié)果;

  • 適用于對業(yè)務(wù)最終一致性的時(shí)間敏感度低的系統(tǒng);

  • 適合跨企業(yè)的系統(tǒng)間的操作,或者企業(yè)內(nèi)部比較獨(dú)立的系統(tǒng)間的操作,比如銀行通知、商戶通知等;

  • 方案比較

    別人是怎么做的

    alipay的分布式事務(wù)服務(wù)DTS

    分布式事務(wù)服務(wù)(Distributed Transaction Service,簡稱 DTS)是一個(gè)分布式事務(wù)框架,用來保障在大規(guī)模分布式環(huán)境下事務(wù)的最終一致性。DTS 從架構(gòu)上分為 xts-client 和 xts-server 兩部分,前者是一個(gè)嵌入客戶端應(yīng)用的 Jar 包,主要負(fù)責(zé)事務(wù)數(shù)據(jù)的寫入和處理;后者是一個(gè)獨(dú)立的系統(tǒng),主要負(fù)責(zé)異常事務(wù)的恢復(fù)。

    核心概念

    在 DTS 內(nèi)部,我們將一個(gè)分布式事務(wù)的關(guān)聯(lián)方,分為發(fā)起方和參與者兩類:

    發(fā)起方:?分布式事務(wù)的發(fā)起方負(fù)責(zé)啟動(dòng)分布式事務(wù),觸發(fā)創(chuàng)建相應(yīng)的主事務(wù)記錄。發(fā)起方是分布式事務(wù)的協(xié)調(diào)者,負(fù)責(zé)調(diào)用參與者的服務(wù),并記錄相應(yīng)的事務(wù)日志,感知整個(gè)分布式事務(wù)狀態(tài)來決定整個(gè)事務(wù)是 COMMIT 還是 ROLLBACK。

    參與者:參與者是分布式事務(wù)中的一個(gè)原子單位,所有參與者都必須在一階段接口(Prepare)中標(biāo)注(Annotation)參與者的標(biāo)識(shí),它定義了?prepare、commit、rollback?3個(gè)基本接口,業(yè)務(wù)系統(tǒng)需要實(shí)現(xiàn)這3個(gè)接口,并保證其業(yè)務(wù)數(shù)據(jù)的冪等性,也必須保證?prepare?中的數(shù)據(jù)操作能夠被提交(COMMIT)或者回滾(ROLLBACK)。從存儲(chǔ)結(jié)構(gòu)上,DTS 的事務(wù)狀態(tài)數(shù)據(jù)可以分為主事務(wù)記錄(Activity)和分支事務(wù)記錄(Action)兩類:

    主事務(wù)記錄 Activity:主事務(wù)記錄是整個(gè)分布式事務(wù)的主體,其最核心的數(shù)據(jù)結(jié)構(gòu)是事務(wù)號(TX_ID)和事務(wù)狀態(tài)(STATE),它是在啟動(dòng)分布式事務(wù)的時(shí)候持久化寫入數(shù)據(jù)庫的,它的狀態(tài)決定了這筆分布式事務(wù)的狀態(tài)。

    分支事務(wù)記錄 Action:分支事務(wù)記錄是主事務(wù)記錄的一個(gè)子集,它記錄了一個(gè)參與者的信息,其中包括參與者的 NAME 名稱,DTS 通過這個(gè) NAME 來唯一定位一個(gè)參與者。通過這個(gè)分支事務(wù)信息,我們就可以對參與者進(jìn)行提交或者回滾操作。

    這應(yīng)該屬于我們上面所說的TCC模式。

    eBay 本地消息表

    本地消息表這種實(shí)現(xiàn)方式的思路,其實(shí)是源于ebay,后來通過支付寶等公司的布道,在業(yè)內(nèi)廣泛使用。其基本的設(shè)計(jì)思想是將遠(yuǎn)程分布式事務(wù)拆分成一系列的本地事務(wù)。如果不考慮性能及設(shè)計(jì)優(yōu)雅,借助關(guān)系型數(shù)據(jù)庫中的表即可實(shí)現(xiàn)。

    舉個(gè)經(jīng)典的跨行轉(zhuǎn)賬的例子來描述。第一步,扣款1W,通過本地事務(wù)保證了憑證消息插入到消息表中。第二步,通知對方銀行賬戶上加1W了。那問題來了,如何通知到對方呢?

    通常采用兩種方式:

  • 采用時(shí)效性高的MQ,由對方訂閱消息并監(jiān)聽,有消息時(shí)自動(dòng)觸發(fā)事件

  • 采用定時(shí)輪詢掃描的方式,去檢查消息表的數(shù)據(jù)。

  • 類似使用本地消息表+消息通知的還有去哪兒,蘑菇街

    各種第三方支付回調(diào)

    最大努力通知型。如支付寶、微信的支付回調(diào)接口方式,不斷回調(diào)直至成功,或直至調(diào)用次數(shù)衰減至失敗狀態(tài)。

    我們可以怎么來做

    2PC/3PC需要資源管理器(mysql, redis)支持XA協(xié)議,且整個(gè)事務(wù)的執(zhí)行期間需要鎖住事務(wù)資源,會(huì)降低性能。故先排除。

    TCC的模式,需要事務(wù)接口提供try,confirm,cancel三個(gè)接口,提高了編程的復(fù)雜性。需要依賴于業(yè)務(wù)方來配合提供這樣的接口。推行難度大,暫時(shí)排除。

    最大努力通知型,應(yīng)用于異構(gòu)或者服務(wù)平臺(tái)當(dāng)中

    可以看到ebay的經(jīng)典模式中,分布式的事務(wù),是通過本地事務(wù)+可靠消息,來達(dá)到事務(wù)的最終一致性的。但是出現(xiàn)了事務(wù)消息,就把本地事務(wù)的工作給涵蓋在事務(wù)消息當(dāng)中了。所以,接下來要基于事務(wù)消息來套我們的應(yīng)用場景,看起是否滿足我們對分布式事務(wù)產(chǎn)品的要求。

    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的分布式事务不理解?一次给你讲清楚!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 性囗交免费视频观看 | 日本xx片| 国产精品视频久久久久 | 久草这里只有精品 | 日韩天堂在线观看 | 九九久久99| www.精品一区 | 国产精品边吃奶边做爽 | 色网站在线看 | 啪视频在线观看 | 欧美肥老妇视频 | 受虐m奴xxx在线观看 | 波多野结av衣东京热无码专区 | 摸摸大奶子 | 免费在线黄网站 | 狠狠网| 国产精品成人一区 | 成人av网址在线 | 亚洲激情欧美色图 | 无码乱人伦一区二区亚洲 | 2020亚洲男人天堂 | 免费观看黄色网页 | 中文字幕永久在线 | 亚洲伊人成人网 | 欧美xxxx日本和非洲 | av手机在线看 | 黑人乱码一区二区三区av | 中文字幕人乱码中文字 | 久久精品这里只有精品 | 亚洲国产成人精品久久 | 婷婷伊人综合中文字幕 | 国产理论视频在线观看 | 国产精品探花在线观看 | 日本午夜精品 | 天堂视频在线观看免费 | 精品一区二区三区无码视频 | 国产欧美三区 | 亚洲第一女人av | 视频一区 国产 | 亚洲国产在 | 国产一区二区三区四区视频 | 6090伦理| 麻豆网站免费观看 | 精品福利视频导航 | 久久一区二区三区四区 | 99久久精品免费看国产四区 | 捆绑黑丝美女 | 劲爆欧美第一页 | 91视频在线观看网站 | 在线免费小电影 | 国产精品88av | 日韩h在线 | 欧美成人精品一区二区三区在线看 | jizzjizzjizz亚洲| 自拍亚洲欧美 | 在线观看a级片 | 亚洲美女自拍视频 | 丰满岳跪趴高撅肥臀尤物在线观看 | 最新日韩在线视频 | 欧美日韩国产免费观看 | 99插插插| 麻豆传媒网站入口 | 黄色综合网 | 久久婷婷成人综合色 | 国产精品熟女久久久久久 | 久操福利在线 | 欧美性爱精品在线 | 九九视频国产 | 美女校花脱精光 | 成人午夜网 | 无码一区二区 | 影音先锋 日韩 | 日本美女黄视频 | 大波大乳videos巨大 | 激情国产一区 | 欧美瑟瑟 | 国内自拍小视频 | 日韩中文av在线 | 人妻巨大乳一二三区 | 国产女人18毛片水18精品 | 亚洲精品小视频在线观看 | 亚洲激情久久久 | 国产69精品久久久久久久 | 69综合| 超碰在线观看免费版 | 93看片淫黄大片一级 | 欧美日韩亚洲不卡 | 18禁裸乳无遮挡啪啪无码免费 | 日韩操操操 | 一级国产精品 | 夜夜爽av| 51精产品一区一区三区 | 成人午夜免费福利视频 | 国产91久久婷婷一区二区 | av高清一区| 国内毛片毛片毛片 | 欧美五月激情 | 蜜臀久久精品久久久久 | 午夜色福利 |