聊聊分散式事務

天NULL發表於2024-04-10

分散式事務,算是分散式系統極為重要的一個模組。

分散式事務的概念,網上隨手可見,我不多講。

今天主要想聊聊,分散式事務的解決思路及其適用場景。

在說具體思路之前,我先假設一個業務排程功能,分別會呼叫A、B、C三個服務。

要保證這三個服務的事務,該怎麼辦呢?

可靠訊息佇列

A業務完成並提交資料庫事務後,傳送訊息;B收到訊息後,完成業務並提交資料庫事務後,傳送訊息;

C收到訊息後,完成業務並提交資料庫事務。

整個過程,要保證盡一切可能完成,極端情況甚至需要人工介入。

優點:系統效能好(無需資料庫鎖)。

缺點:只能保證最終一致性,且可能需要人工介入。

適用場景:比如支付公司,交易和清分,便很適合透過可靠訊息佇列來實現,能極大提升交易介面效能。

XA

透過資料庫事務來實現。

優點:真正的資料庫級別事務。

缺點:效能低。若A、B、C跨公司,則完全無法實現。

TCC

分為Try、Commit、Cancel兩個階段

先預留業務資源,成功則Commit,失敗則Cancel。

優點:效能高。

缺點:實現複雜,容易出錯。且有些業務無法預留業務資源。

適用場景:透過賬戶交易下單類業務。比如將錢充值到加油App後,

透過App賬戶加油。(這個業務,必須先加油,再扣錢,所以必須鎖住賬戶餘額)

AT

A、B、C分別執行並提交本地資料庫事務,當失敗時,執行逆向SQL。這個方案,需要藉助框架,逆向

SQL是框架自動生成且由框架自動執行。

優點:效能高,業務端實現簡單。

缺點:由於沒有預留業務資源,可能導致資源無法回收。

適用場景:公司內部系統,跨公司系統無法使用。

SAGA

業務編排 + 反向補償,反向補償又分為實時補償和定時補償。

優點:效能高,跨公司事務也能支援。

缺點:可能出現業務無法補償的情況,所以對業務編排有要求。

適用場景:跨公司類的長事務業務。

相關文章