簡介
Apache Seata? (incubating) 是什么?
Seata 是一款開源的分布式事務解決方案,致力于在微服務架構下提供高性能和簡單易用的分布式事務服務。在 Seata 開源之前,其內部版本在阿里系內部一直扮演著應用架構層數據一致性的中間件角色,幫助經濟體平穩的度過歷年的雙11,對上層業務進行了有力的技術支撐。經過多年沉淀與積累,其商業化產品先后在阿里云、金融云上售賣。2019.1 為了打造更加完善的技術生態和普惠技術成果,Seata 正式宣布對外開源,未來 Seata 將以社區共建的形式幫助用戶快速落地分布式事務解決方案。
Seata 原理深度解析:分布式事務的一致性實現
一、核心架構設計
Seata 采用?三組件模型,通過解耦事務協調與資源管理,實現分布式事務的高效處理:
1.1 核心組件
組件 | 角色 | 關鍵功能 |
---|---|---|
TC (協調器) | 獨立部署的服務器,作為全局事務的控制中心 | - 維護全局事務狀態(開始/提交/回滾) - 協調分支事務的提交/回滾 - 存儲事務元數據(XID、分支ID等) |
TM (管理器) | 嵌入微服務中的客戶端組件,定義全局事務邊界 | - 發起全局事務(生成XID) - 通知TC提交或回滾事務 - 管理事務上下文(XID傳播) |
RM (資源管理器) | 嵌入微服務中的客戶端組件,管理分支事務與本地資源交互 | - 注冊分支事務到TC - 執行本地SQL并生成回滾日志(UNDO_LOG) - 響應TC的提交/回滾命令 |
1.2 協作流程
- 全局事務啟動:TM 向 TC 發起?
begin
?請求,TC 生成全局唯一 XID。 - 分支事務注冊:RM 向 TC 注冊分支事務,綁定 XID。
- 執行本地事務:RM 執行 SQL,生成?前鏡像(Before Image)?和?后鏡像(After Image),記錄到 UNDO_LOG 表。
- 提交/回滾決策:
- 成功:TM 通知 TC 提交,TC 依次通知 RM 提交分支事務(刪除 UNDO_LOG)。
- 失敗:TM 通知 TC 回滾,TC 通知 RM 通過前鏡像恢復數據。
二、事務模式詳解
Seata 支持四種事務模式,覆蓋不同場景的需求:
2.1 AT 模式(默認模式)
- 原理:基于 SQL 解析的自動補償,無需手動編碼。
- 一階段:解析 SQL,生成前后鏡像并插入 UNDO_LOG,提交本地事務。
- 二階段:
- 提交:異步刪除 UNDO_LOG,釋放資源。
- 回滾:通過前鏡像恢復數據,校驗后鏡像防止臟寫。
- 適用場景:常規業務(如電商訂單、庫存管理),零代碼入侵。
2.2 TCC 模式(Try-Confirm-Cancel)
- 原理:手動實現三階段接口,精細控制事務。
- Try:預留資源(如凍結賬戶余額)。
- Confirm:確認預留資源(如扣除凍結金額)。
- Cancel:釋放預留資源(如解凍余額)。
- 適用場景:金融支付、高并發資金操作,需精確控制事務流程。
2.3 SAGA 模式(長事務補償)
- 原理:通過狀態機編排子事務,支持反向補償。
- 正向流程:按順序執行子事務并提交。
- 補償流程:任一子事務失敗時,反向執行補償操作(如撤銷訂單、退款)。
- 適用場景:跨系統業務流程(如訂單→物流→支付)、長周期事務(如保險理賠)。
2.4 XA 模式(依賴數據庫協議)
- 原理:基于數據庫原生 XA 協議,實現強一致性。
- 兩階段提交:準備階段鎖定資源,提交階段持久化變更。
- 適用場景:傳統系統遷移、強一致性要求的核心系統(如銀行核心交易)。
三、數據一致性保障機制
3.1 兩階段提交(2PC)優化
- 準備階段:
- RM 執行 SQL 并生成 UNDO_LOG,鎖定資源(行級鎖)。
- 向 TC 注冊分支事務,等待全局決策。
- 提交階段:
- 異步提交:分支事務提交后,異步刪除 UNDO_LOG,減少阻塞。
- 批量操作:合并分支事務操作,降低 TC 負載。
3.2 全局鎖與隔離級別
- 全局鎖:防止臟寫,確保分支事務提交前獲取鎖。
- 隔離級別:
- 默認:全局讀未提交(Read Uncommitted),但通過全局鎖避免臟讀。
- 實際效果:接近讀已提交(Read Committed),平衡性能與一致性。
3.3 異常處理
- 自動回滾:任一分支失敗時,TC 觸發全局回滾,RM 通過 UNDO_LOG 恢復數據。
- 懸掛處理:TCC 模式中,若 Try 未執行但 Cancel 先到,則拒絕執行,避免資源錯誤釋放。
- 冪等控制:通過 XID 和 Branch ID 確保操作重復執行時的狀態一致性。
四、性能優化策略
4.1 存儲模式
模式 | 性能 | 可靠性 | 適用場景 |
---|---|---|---|
文件 | 高 | 低 | 單機調試、非生產環境 |
DB | 中 | 高 | TC 集群模式、生產環境 |
Redis | 高 | 中 | 高并發、低延遲場景 |