1 簡要介紹
隨著微服務架構的不斷髮展,分散式系統逐漸普及到後端領域的每一個角落。
在分散式系統中,跨多個服務的資料一致性一直是一個重大挑戰,為解決這一挑戰,分散式事務應運而生。
作者在之前的文章《五種分散式事務解決方案》和《4大主流分散式演算法介紹》中,詳細介紹了分散式事物的解決方案以及實現原理。接下來,咱們詳細介紹下行業內主流的幾個分散式事務框架,以及他們的實現原理。
2 主流分散式事務框架
2.1 Seata
Seata是一款由阿里巴巴開源的分散式事務解決方案,致力於在微服務架構下提供高效能和簡單易用的分散式事務服務。它解決了分散式系統中的資料一致性問題,幫助開發者在分散式場景下實現ACID事務的支援。
2.1.1 核心元件
Seata 包含三個核心元件:
- Transaction Coordinator (TC):事務協調者,維護全域性和分支事務的狀態,驅動全域性事務提交或回滾。
- Transaction Manager (TM):事務管理器,定義全域性事務的範圍:開始全域性事務、提交或回滾全域性事務。
- Resource Manager (RM):資源管理器,管理分支事務處理的資源,與TC交談以註冊分支事務和報告分支事務的狀態,並驅動分支事務提交或回滾。
以上三個元件相互協作,TC 以 Seata 伺服器(Server)形式獨立部署,來協調各個微服務分支的事務狀態,保證全域性的事務執行。TM 和 RM 則是以 Seata Client 的形式整合在微服務中執行。
下面用一張圖來說明:
工作流程如下:
- TM 向 TC 申請建立一個全域性事務,建立成功後,同步生成一個全域性唯一的 XID。此時全域性事務已開啟。
- XID 透過服務的呼叫鏈傳遞到其他服務
- RM 向 TC 註冊一個分支事務,並將其納入 XID 對應全域性事務的管轄
- TM 根據 TC 收集的各個分支事務的執行結果,向 TC 發起全域性事務提交或回滾決議
- TC 排程 XID 下管轄的所有分支事務,如果都成功則完成提交,否則回滾操作
2.1.2 工作模式
Seata 支援三種工作模式:
-
AT模式(基於支援本地ACID事務的資料庫):
- 無需侵入業務程式碼,基於資料層
- 兩階段提交協議的變種
- 效能較好,但存在髒回滾的風險(回滾日誌的生成和清理)
-
TCC模式(Try-Confirm-Cancel):
- 侵入業務程式碼
- 開發者需要編寫Try、Confirm、Cancel介面
- 無鎖,高效能
-
Saga模式:
- 長事務解決方案
- 透過事件驅動的方式,允許業務自定義正向和補償操作
- 適用於業務流程長、業務流程多、參與方多的場景
2.1.3 核心特性
- 高效能:Seata 採用了高效的通訊協議和事務處理機制,確保在高併發場景下依然能夠保持高效能。
- 簡單易用:Seata 提供了簡單易用的API和配置,開發者可以快速整合和使用。
- 擴充套件性:Seata 支援靈活的擴充套件機制,可以根據業務需求定製各種擴充套件元件。
- 社群支援:作為阿里巴巴開源專案,Seata 得到了廣泛的社群支援和貢獻。
2.2 ByteTCC
ByteTCC 是一個基於 TCC(Try/Confirm/Cancel)機制的分散式事務管理器。它旨在解決微服務架構下分散式事務的一致性問題,透過將事務拆分為多個階段(Try、Confirm、Cancel)來確保事務的原子性。ByteTCC 相容 JTA 規範,可以很好地與 EJB、Spring 等容器進行整合。值得注意的是,相對於通用事務工框架Seata,ByteTCC更專注於TCC模式,與Java生態結合的非常好。
2.2.1 工作原理
ByteTCC 的工作原理基於 TCC 模式,將事務分為三個階段:
- Try 階段:在此階段,事務參與者嘗試執行事務的一部分,並記錄相應的狀態和資料。如果所有參與者的 Try 階段都成功,則進入 Confirm 階段;否則,進入 Cancel 階段。
- Confirm 階段:在此階段,如果 Try 階段成功,則參與者將確認事務的執行,並進行最終的提交。如果 Confirm 階段成功,則全域性事務提交;否則,根據失敗情況決定是回滾還是進行補償操作。
- Cancel 階段:如果 Try 階段失敗或 Confirm 階段出現問題,則進入 Cancel 階段。在此階段,參與者將進行事務的回滾,以確保資料的一致性。
2.2.2 核心特性
- 支援多種事務機制:ByteTCC 支援普通事務、TCC 事務、Saga 事務等事務機制,以適應不同的業務需求。
- 跨應用、跨伺服器支援:ByteTCC 支援多資料來源、跨應用、跨伺服器等分散式事務場景,確保資料在分散式環境下的一致性。
- 長事務處理:ByteTCC 適用於處理耗時較長但仍需保持事務性的操作。
- 支援多種服務框架:ByteTCC 支援 Dubbo 和 Spring Cloud 等主流服務框架,使得開發者能夠在不同框架下輕鬆啟用分散式事務。
- 宣告式事務管理:透過簡單的註解,開發者可以將普通服務轉換為 TCC 服務,降低開發難度。
2.2.3 存在的缺點
- 服務侵入性強,每個事務都必須實現 Try、Confirm、Cancel 三個方法,成本高
- 為了保證事務一致性,Try、Confirm、Cancel 介面必須實現冪等
- 記錄事務日誌,必定會損耗一定的效能,並使得整個 TCC 事務時間拉長
2.2.4 應用場景
ByteTCC 可廣泛應用於金融、電商等領域,尤其適用於涉及多個服務互動的複雜交易場景,例如資金轉賬、訂單建立等。透過其強大功能,可以確保在分散式環境中實現事務的一致性和可靠性,有效防止資料不一致的問題。
2.3 TCC-Transaction
TCC-Transaction:華為開源的分散式事務框架,基於TCC補償機制實現,支援高效能和高可用,提供了簡單易用的API介面和工具支援。
可以擴充套件閱讀下這篇文章《TCC-Transaction分散式事務》,寫的比較清楚,我這邊就不贅述了。
3 總結
無論哪種事務框架,目標無非是實現分散式系統的資料一致性。當然代價也是有的,比如
服務侵入,成本提升、效能開銷等,都需要衡量。使用前可以先期調研,選擇最適合的框架。