站長資訊網
        最全最豐富的資訊網站

        手把手教你用PHP完成一個分布式事務TCC

        什么是TCC,TCC是Try、Confirm、Cancel三個詞語的縮寫,最早是由 Pat Helland 于 2007 年發表的一篇名為《Life beyond Distributed Transactions:an Apostate’s Opinion》的論文提出。

        TCC組成

        TCC分為3個階段

        • Try 階段:嘗試執行,完成所有業務檢查(一致性), 預留必須業務資源(準隔離性)
        • Confirm 階段:如果所有分支的Try都成功了,則走到Confirm階段。Confirm真正執行業務,不作任何業務檢查,只使用 Try 階段預留的業務資源
        • Cancel 階段:如果所有分支的Try有一個失敗了,則走到Cancel階段。Cancel釋放 Try 階段預留的業務資源。

        TCC分布式事務里,有3個角色,與經典的XA分布式事務一樣:

        • AP/應用程序,發起全局事務,定義全局事務包含哪些事務分支
        • RM/資源管理器,負責分支事務各項資源的管理
        • TM/事務管理器,負責協調全局事務的正確執行,包括Confirm,Cancel的執行,并處理網絡異常

        如果我們要進行一個類似于銀行跨行轉賬的業務,轉出(TransOut)和轉入(TransIn)分別在不同的微服務里,一個成功完成的TCC事務典型的時序圖如下:

        手把手教你用PHP完成一個分布式事務TCC

        TCC實踐

        下面我們進行一個TCC事務的具體開發

        目前可用于TCC的開源框架,主要為Java語言,其中以seata為代表。我們的例子采用nodejs,使用的分布式事務框架為dtm,它對分布式事務的支持非常優雅。下面來詳細講解TCC的組成

        下面我們來編寫具體的Try/Confirm/Cancel的處理函數

        $vega->handleFunc('/api/TransOutTry', function (MixVegaContext $ctx) {     var_dump('TransOutTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());     $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutConfirm', function (MixVegaContext $ctx) {     var_dump('TransOutConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());     $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutCancel', function (MixVegaContext $ctx) {     var_dump('TransOutCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());     $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInTry', function (MixVegaContext $ctx) {     var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());     $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInConfirm', function (MixVegaContext $ctx) {     var_dump('TransInConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());     $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInCancel', function (MixVegaContext $ctx) {     var_dump('TransInCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());     $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');

        到此各個子事務的處理函數已經OK了,然后是開啟TCC事務,進行分支調用

            DtmclitccGlobalTransaction($dtm, function ($tcc) use ($svc) {         /** @var DtmcliTcc $tcc */         $req = ['amount' => 30];         $tcc->callBranch($req, $svc . '/TransOutTry', $svc . '/TransOutConfirm', $svc . '/TransOutCancel');         $tcc->callBranch($req, $svc . '/TransInTry', $svc . '/TransInConfirm', $svc . '/TransInCancel');     });

        至此,一個完整的TCC分布式事務編寫完成。

        如果您想要完整運行一個成功的示例,那么參考這個例子yedf/dtmcli-php-sample,將它運行起來非常簡單

        # 部署啟動dtm# 需要docker版本18以上git clone https://github.com/yedf/dtmcd dtm docker-compose up# 另起一個命令行https://github.com/yedf/dtmcli-php-sample.gitcd dtmcli-php-sample composer installphp demo.php start

        TCC的回滾

        假如銀行將金額準備轉入用戶2時,發現用戶2的賬戶異常,返回失敗,會怎么樣?我們可以讓TransIn返回失敗來模擬這種情況

        $vega->handleFunc('/api/TransInTry', function (MixVegaContext $ctx) {     var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());     $ctx->JSON(200, ['result' => 'FAILURE']);})->methods('POST');

        我們給出事務失敗交互的時序圖

        手把手教你用PHP完成一個分布式事務TCC

        這個跟成功的TCC差別就在于,當某個子事務返回失敗后,后續就回滾全局事務,調用各個子事務的Cancel操作,保證全局事務全部回滾。

        在TCC事務模式上,有不少的讀者會問,如果Confirm/Cancel失敗會怎么樣?這是一個好問題,代表您正在深入思考TCC事務模式。第一種情況是臨時失敗,例如網絡故障、應用或數據庫宕機,這類錯誤進行重試,最后會返回成功;另一種情況為業務失敗,按照TCC的協議,第一階段鎖定資源,保證足夠的資源能夠讓Confirm/Cancel執行,也就是說,程序邏輯上,Confirm/Cancel是不允許返回業務失敗的,如果出現業務失敗,那么是bug,需要開發人員手動修復bug。

        小結

        在這篇文章里,我們介紹了TCC的理論知識,也通過一個例子,完整給出了編寫一個TCC事務的過程,涵蓋了正常成功完成,以及成功回滾的情況。相信讀者通過這邊文章,對TCC已經有了深入的理解。

        關于分布式事務

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品多p对白交换绿帽| 在线精品亚洲一区二区| 亚洲第一永久AV网站久久精品男人的天堂AV | 国产精品久久久久影院嫩草| 91精品全国免费观看青青| 国产欧美精品AAAAAA片| 国产92成人精品视频免费| 久久人人超碰精品CAOPOREN | 国产精品人人做人人爽人人添| 国产精品内射视频免费| 国语自产精品视频在线区| 亚洲精品欧美二区三区中文字幕| 国产色精品vr一区区三区| 夜夜精品无码一区二区三区| 国产欧美日韩精品a在线观看| 亚洲国产成人精品无码久久久久久综合 | 一区二区国产精品 | 精品国产第一国产综合精品| 亚洲AV永久无码精品一区二区 | 91精品欧美综合在线观看| 久久精品aⅴ无码中文字字幕不卡| 国产福利在线观看精品| 亚洲动漫精品无码av天堂| 国产精品一久久香蕉国产线看| 久久精品中文无码资源站| 中文字幕精品久久| 亚洲а∨天堂久久精品9966| 无翼乌无遮挡全彩老师挤奶爱爱帝国综合社区精品 | 色播精品免费小视频| 久久久精品久久久久久| www夜片内射视频日韩精品成人| 亚洲综合精品网站在线观看| 久久久久久久久久免免费精品| 成人国产精品日本在线观看| 日韩精品在线免费观看| 久久成人影院精品777| 亚洲精品专区在线观看| 久久精品国产一区二区电影| 精品久久久久一区二区三区 | 精品国产一区二区三区无码 | 黑人巨茎精品欧美一区二区|