分布式事務之TCC服務設計和實現注意事項

2021-09-13 12:25:21 字數 2466 閱讀 1185

摘要: 1、tcc簡介 tcc是一種比較成熟的分布式事務解決方案,可用於解決跨庫操作的資料一致性問題; tcc是服務化的兩階段程式設計模型,其try、confirm、cancel 3個方法均由業務編碼實現; 其中try操作作為一階段,負責資源的檢查和預留,confirm操作作為二階段提交操作,執行真正的業務,...

1、tcc簡介

tcc是一種比較成熟的分布式事務解決方案,可用於解決跨庫操作的資料一致性問題;

tcc是服務化的兩階段程式設計模型,其try、confirm、cancel 3個方法均由業務編碼實現;

其中try操作作為一階段,負責資源的檢查和預留,confirm操作作為二階段提交操作,執行真正的業務,cancel是預留資源的取消;

如下圖所示,業務實現tcc服務之後,該tcc服務將作為分布式事務的其中乙個資源,參與到整個分布式事務中;事務管理器分2階段協調tcc服務,在第一階段呼叫所有tcc服務的try方法,在第二階段執行所有tcc服務的confirm或者cancel方法;

2、使用者在實現tcc服務時,有以下注意事項

1、業務操作分兩階段完成:

如下圖所示,接入tcc前,業務操作只需要一步就能完成,但是在接入tcc之後,需要考慮如何將其分成2階段完成,把資源的檢查和預留放在一階段的try操作中進行,把真正的業務操作的執行放在二階段的confirm操作中進行;

tcc服務要保證第一階段try操作成功之後,二階段confirm操作一定能成功;

2、允許空回滾;

如下圖所示,事務協調器在呼叫tcc服務的一階段try操作時,可能會出現因為丟包而導致的網路超時,此時事務協調器會觸發二階段回滾,呼叫tcc服務的cancel操作;

tcc服務在未收到try請求的情況下收到cancel請求,這種場景被稱為空回滾;tcc服務在實現時應當允許空回滾的執行;

3、防懸掛控制;

如下圖所示,事務協調器在呼叫tcc服務的一階段try操作時,可能會出現因網路擁堵而導致的超時,此時事務協調器會觸發二階段回滾,呼叫tcc服務的cancel操作;在此之後,擁堵在網路上的一階段try資料報被tcc服務收到,出現了二階段cancel請求比一階段try請求先執行的情況;

使用者在實現tcc服務時,應當允許空回滾,但是要拒絕執行空回滾之後到來的一階段try請求;

4、冪等控制:

無論是網路資料報重傳,還是異常事務的補償執行,都會導致tcc服務的try、confirm或者cancel操作被重複執行;使用者在實現tcc服務時,需要考慮冪等控制,即try、confirm、cancel 執行一次和執行多次的業務結果是一樣的;

5、業務資料可見性控制;

tcc服務的一階段try操作會做資源的預留,在二階段操作執行之前,如果其他事務需要讀取被預留的資源資料,那麼處於中間狀態的業務資料該如何向使用者展示,需要業務在實現時考慮清楚;通常的設計原則是「寧可不展示、少展示,也不多展示、錯展示」;

6、業務資料併發訪問控制;

tcc服務的一階段try操作預留資源之後,在二階段操作執行之前,預留的資源都不會被釋放;如果此時其他分布式事務修改這些業務資源,會出現分布式事務的併發問題;

使用者在實現tcc服務時,需要考慮業務資料的併發控制,盡量將邏輯鎖粒度降到最低,以最大限度的提高分布式事務的併發性;

3、總結

螞蟻金服使用tcc有10年歷史,在tcc應用方面積累了大量實踐經驗;除了上述tcc服務的設計注意事項外,我們在解決使用者高併發、高可用需求方面也提供了解決方案,我們對分布式事務做了極致的效能優化以支援雙11等大促的高併發需求,我們基於螞蟻ldc架構的高可用方案能使分布式事務服務達到99.99%的可用性;

螞蟻金服大部分業務系統均採用tcc的方式接入分布式事務,但設計tcc服務時要遵循大量設計規範,這無疑對使用者提了非常高的要求;為了簡化使用者接入分布式事務的門檻,螞蟻金服的分布式事務框架(sofa-dtx)推出了fmt(framework-managed transactions)模式和xa模式,這兩種模式均不需要使用者實現tcc服務,使用者只需要關注自身業務sql便可;dtx的三種模式:tcc、fmt和xa相互之間是功能互補,相輔相成的,形成了螞蟻金服完善的分布式事務解決方案。

sofa-dtx全面覆蓋金融場景,金融級容災保障、提供豐富的接入模式並且使用簡潔易於接入;目前已經應用在支付寶、網上銀行、螞蟻財富、芝麻信用、南京銀行等專案中。

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 訂單服務 修...