<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>

          用python輕松完成一個(gè)分布式事務(wù)TCC,保姆級(jí)教程

          共 3786字,需瀏覽 8分鐘

           ·

          2021-07-28 11:08

          作者:葉東富

          來(lái)源:SegmentFault 思否社區(qū)


          什么是分布式事務(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ù)中,用戶A-100操作和用戶B+100操作不是位于同一個(gè)節(jié)點(diǎn)上。本質(zhì)上來(lái)說(shuō),分布式事務(wù)就是為了保證在分布式場(chǎng)景下,數(shù)據(jù)操作的正確執(zhí)行。

          什么是TCC分布式事務(wù),TCC是Try、Confirm、Cancel三個(gè)詞語(yǔ)的縮寫(xiě),最早是由 Pat Helland 于 2007 年發(fā)表的一篇名為《Life beyond Distributed Transactions:an Apostate’s Opinion》的論文提出。

          TCC組成

          TCC分為3個(gè)階段

          • Try 階段:嘗試執(zhí)行,完成所有業(yè)務(wù)檢查(一致性), 預(yù)留必須業(yè)務(wù)資源(準(zhǔn)隔離性)

          • Confirm 階段:如果所有分支的Try都成功了,則走到Confirm階段。Confirm真正執(zhí)行業(yè)務(wù),不作任何業(yè)務(wù)檢查,只使用 Try 階段預(yù)留的業(yè)務(wù)資源

          • Cancel 階段:如果所有分支的Try有一個(gè)失敗了,則走到Cancel階段。Cancel釋放 Try 階段預(yù)留的業(yè)務(wù)資源。


          TCC分布式事務(wù)里,有3個(gè)角色,與經(jīng)典的XA分布式事務(wù)一樣:
          • AP/應(yīng)用程序,發(fā)起全局事務(wù),定義全局事務(wù)包含哪些事務(wù)分支

          • RM/資源管理器,負(fù)責(zé)分支事務(wù)各項(xiàng)資源的管理

          • TM/事務(wù)管理器,負(fù)責(zé)協(xié)調(diào)全局事務(wù)的正確執(zhí)行,包括Confirm,Cancel的執(zhí)行,并處理網(wǎng)絡(luò)異常


          如果我們要進(jìn)行一個(gè)類似于銀行跨行轉(zhuǎn)賬的業(yè)務(wù),轉(zhuǎn)出(TransOut)和轉(zhuǎn)入(TransIn)分別在不同的微服務(wù)里,一個(gè)成功完成的TCC事務(wù)典型的時(shí)序圖如下:


          TCC實(shí)踐

          下面我們進(jìn)行一個(gè)TCC事務(wù)的具體開(kāi)發(fā)
          目前可用于TCC的開(kāi)源框架,主要為Java語(yǔ)言,其中以seata為代表。我們的例子采用python,使用的分布式事務(wù)框架為dtm,它對(duì)分布式事務(wù)的支持非常優(yōu)雅。下面來(lái)詳細(xì)講解TCC的組成
          下面我們來(lái)編寫(xiě)具體的Try/Confirm/Cancel的處理函數(shù)
          @app.post("/api/TransOutTry")
          def trans_out_try():
              return {"dtm_result""SUCCESS"}

          @app.post("/api/TransOutConfirm")
          def trans_out_confirm():
              return {"dtm_result""SUCCESS"}

          @app.post("/api/TransOutCancel")
          def trans_out_cancel():
              return {"dtm_result""SUCCESS"}

          @app.post("/api/TransInTry")
          def trans_in_try():
              return {"dtm_result""SUCCESS"}

          @app.post("/api/TransInConfirm")
          def trans_in_confirm():
              return {"dtm_result""SUCCESS"}

          @app.post("/api/TransInCancel")
          def trans_in_cancel():
              return {"dtm_result""SUCCESS"}
          到此各個(gè)子事務(wù)的處理函數(shù)已經(jīng)OK了,然后是開(kāi)啟TCC事務(wù),進(jìn)行分支調(diào)用
          # 這是dtm服務(wù)地址
          dtm = "http://localhost:8080/api/dtmsvr"
          # 這是業(yè)務(wù)微服務(wù)地址
          svc = "http://localhost:5000/api"

          @app.get("/api/fireTcc")
          def fire_tcc():
              # 發(fā)起tcc事務(wù),其中tcc_trans進(jìn)行具體的業(yè)務(wù)處理
              gid = tcc.tcc_global_transaction(dtm, tcc_trans)
              return {"gid": gid}

          # tcc事務(wù)的具體處理
          def tcc_trans(t):
              req = {"amount": 30} # 業(yè)務(wù)請(qǐng)求的負(fù)荷
              # 調(diào)用轉(zhuǎn)出服務(wù)的Try|Confirm|Cancel
              t.call_branch(req, svc + "/TransOutTry", svc + "/TransOutConfirm", svc + "/TransOutCancel")
              # 調(diào)用轉(zhuǎn)入服務(wù)的Try|Confirm|Cancel
              t.call_branch(req, svc + "/TransInTry", svc + "/TransInConfirm", svc + "/TransInCancel")
          至此,一個(gè)完整的TCC分布式事務(wù)編寫(xiě)完成。
          如果您想要完整運(yùn)行一個(gè)成功的示例,那么參考這個(gè)例子yedf/dtmcli-py-sample,將它運(yùn)行起來(lái)非常簡(jiǎn)單
          # 部署啟動(dòng)dtm
          # 需要docker版本18以上
          git clone https://github.com/yedf/dtm
          cd dtm
          docker-compose up

          # 另起一個(gè)命令行
          git clone https://github.com/yedf/dtmcli-py-sample
          cd dtmcli-py-sample
          pip3 install flask dtmcli requests
          flask run

          # 另起一個(gè)命令行
          curl localhost:5000/api/fireTcc

          TCC的回滾

          假如銀行將金額準(zhǔn)備轉(zhuǎn)入用戶2時(shí),發(fā)現(xiàn)用戶2的賬戶異常,返回失敗,會(huì)怎么樣?
          我們將前面的TransIn處理函數(shù),改成返回失敗,整個(gè)事務(wù)最后就會(huì)失敗回滾
          @app.post("/api/TransInTry")
          def trans_in_try():
              return {"dtm_result""FAILURE"}
          我們給出事務(wù)失敗交互的時(shí)序圖

          這個(gè)跟成功的TCC差別就在于,當(dāng)某個(gè)子事務(wù)返回失敗后,后續(xù)就回滾全局事務(wù),調(diào)用各個(gè)子事務(wù)的Cancel操作,保證全局事務(wù)全部回滾。

          TCC網(wǎng)絡(luò)異常

          TCC在整個(gè)全局事務(wù)的過(guò)程中,可能發(fā)生各類網(wǎng)絡(luò)異常情況,典型的是空回滾、冪等、懸掛,由于TCC的異常情況,和SAGA、可靠消息等事務(wù)模式有相近的地方,因此我們把所有異常的解決方案統(tǒng)統(tǒng)放在這篇文章《子事務(wù)屏障,一個(gè)函數(shù)調(diào)用搞定分布式事務(wù)亂序》進(jìn)行講解

          小結(jié)

          在這篇文章里,我們介紹了TCC的理論知識(shí),也通過(guò)一個(gè)例子,完整給出了編寫(xiě)一個(gè)TCC事務(wù)的過(guò)程,涵蓋了正常成功完成,以及成功回滾的情況。相信讀者通過(guò)這邊文章,對(duì)TCC已經(jīng)有了深入的理解。


          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開(kāi)更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  夜夜人妻国产香蕉 | 黄色小视频在线免费观看 | 成人免费性生活视频 | 亚洲黄色自拍 | 青青草在线综合 |