分布式事務之TCC事務模型

2021-09-27 05:12:17 字數 3005 閱讀 5967

我們先套乙個業務場景進去,如下圖所示

那頁面點了支付按鈕,呼叫支付服務,那我們後台要實現下面三個步驟

[1] 訂單服務-修改訂單狀態

[2] 賬戶服務-扣減金錢

[3] 庫存服務-扣減庫存

達到事務的效果,要麼一起成功,要麼一起失敗!就要採取tcc分布式事務方案!

tcc的全稱是(try-confirm-cancel)。如下圖所示

ps:tcc又可以被稱為兩階段補償事務,第一階段try只是預留資源,第二階段要明確的告訴服務提供者,這個資源你到底要不要,對應第二階段的confirm/cancel,用來清除第一階段的影響,所以叫補償型事務。

再打個比方,說tcc太高大上是吧,講rm中的prepare、commit、rollback介面,總知道吧。可以模擬的這麼理解

那差別在哪呢?

rollback、commit、prepare,站在開發者層面是感知不到的,資料庫幫你做了資源的操作!

而try、confirm、cancel,站在開發者層面是能感知到的,這三個方法的業務邏輯,即對資源的操作,開發者是要自己去實現的!

好,下面套入我們的場景,怎麼做呢。比如,你的訂單服務中本來只有乙個介面

//修改**狀態

orderclient.updatestatus();

都要拆為三個介面,即

orderclient.tryupatestatus();

orderclient.confirmupatestatus();

orderclient.cancelupatestatus();

注意了:面試官如果問你,tcc有什麼缺點?這就是很嚴重的缺點,對*****性大!每套業務邏輯、都要按try(請求資源)、confirm(操作資源)、cancel(取消資源),拆分為三個介面!

具體每個階段,每個服務業務邏輯是什麼樣的呢?

假設,庫存數量本來是50,那麼可銷售庫存也是50。賬戶餘額為50,可用餘額也為50。使用者下單,買了1個單價為1元的商品。流程如下:

try階段

訂單服務:修改訂單的狀態為支付中

賬戶服務:賬戶餘額不變,可用餘額減1,然後將1這個數字凍結在乙個單獨的字段裡

庫存服務:庫存數量不變,可銷售庫存減1,然後將1這個數字凍結在乙個單獨的字段裡

confirm階段

訂單服務:修改訂單的狀態為支付完成

賬戶服務:賬戶餘額變為(當前值減凍結欄位的值),可用餘額不變(try階段減過了),凍結欄位清0。

庫存服務:庫存變為(當前值減凍結欄位的值),可銷售庫存不變(try階段減過了),凍結欄位清0。

cancel階段

訂單服務:修改訂單的狀態為未支付

賬戶服務:賬戶餘額不變,可用餘額變為(當前值加凍結欄位的值),凍結欄位清0。

庫存服務:庫存不變,可銷售庫存變為(當前值加凍結欄位的值),凍結欄位清0。

接下來從**程式來說明,為了便於演示,將入參略去。

本來,你支付服務的**是長下面這樣的

那麼,用上tcc模型後,**變成下面這樣

注意了,這種寫法其實嚴格上來說,不是不行。看你業務場景,因為存在一些瑕疵,看你自己有沒辦法接受

(1)cancel或者confirm出現異常了,你怎麼處理?

例如在cancel階段執行如下三行**

orderclient.cancelupdatestatus();

accountclient.canceldecrease();

repositoryclient.canceldecrease();

你第二行出現異常了,第三行沒跑就退出了,怎麼辦?你要對此進行業務補償!

(2)大量邏輯重複

你看啊,我們的執行架構其實是這樣的

trycatch(throwable t)

xxclient.confirm();

有沒辦法讓這個架子交給框架去執行,我們告訴框架,你在每個階段要執行哪些方法就好!

因此,需要引入tcc分布式事務框架,事務的try、confirm、cancel三個狀態交給框架來感知!你只要告訴框架,try要執行啥,confirm要執行啥,cancel要執行啥!如果cancel過程出現異常了,框架有內部的補償措施給你恢復資料!

以分布式tcc框架hmily為例,如果出現cancel異常或者confirm異常的情況,在try階段會儲存好日誌,hmily有內建的排程執行緒池來進行恢復,不用擔心。

那hmily,怎麼感知狀態的呢?也很簡單,就是切面程式設計,核心邏輯如下幾行

我們在使用過程中,只要通過@tcc註解告訴框架confirm方法執行啥,cancel方法執行啥即可!其他的交給框架幫你處理!

好了,不多說了,再說下去就是hmily原始碼解析了,大家有空自己去了解!

tcc分布式事務 分布式事務之TCC事務模型

我們先套乙個業務場景進去,如下圖所示 那頁面點了支付按鈕,呼叫支付服務,那我們後台要實現下面三個步驟 1 訂單服務 修改訂單狀態 2 賬戶服務 扣減金錢 3 庫存服務 扣減庫存 達到事務的效果,要麼一起成功,要麼一起失敗!就要採取tcc分布式事務方案!tcc的全稱是 try confirm canc...

分布式事務之TCC

假設現在有乙個電商系統,裡面有乙個支付訂單的場景。對乙個訂單進行支付之後,我們需要做下面的步驟 以上業務場景對應下面的 public class orderservice tcc是try confirm cancel的簡稱 try 階段 嘗試執行,完成所有業務檢查 一致性 預留必需業務資源 準隔離性...

分布式事務之TCC

如果服務a和服務b之間是同步呼叫,比如服務c需要按流程調服務a和服務b,服務a和服務b要麼一起成功,要麼一起失敗。針對這種情況,目前業內普遍推薦使用tcc事務來解決的!ok,老規矩,我們先套乙個業務場景進去,如下圖所示 那頁面點了支付按鈕,呼叫支付服務,那我們後台要實現下面三個步驟 1 訂單服務 修...