分佈式事務的解決方案—Seata AT 模式
Seata 是一款開源的分佈式事務解決方案的框架,它致力於在微服務架構下提供高性能和簡單易用的分佈式事務服務,Seata 爲用戶提供了 AT、TCC、SAGA 和 XA 事務模式。其中 AT 模式(auto transaction)是一種無侵入的分佈式事務解決方案,AT 模式的核心思想是基於二階段提交實現的。
1、二階段提交
兩階段提交協議 (Two-Phase Commit,2PC) 是一種分佈式事務處理協議,目的是在確保多個分佈式系統中執行的事務能夠在所有參與者中保持一致性。2PC 協議通過將事務的提交過程分爲兩個階段來實現確保即使在出現故障的情況下,也能保持數據的一致。2PC 的實現過程如下所示:
第一階段:表決階段
(1)事務協調者向所有參與者 (Participants) 發送準備請求,詢問它們是否能夠提交事務
(2)每個參與者收到請求後,檢查其本地的事務狀態,確保它能夠完成操作。如果參與者準備好提交,它會將其狀態更改爲 “準備提交(Prepared)” 並返回一個 “準備好” 響應給協調者。如果無法提交,參與者會返回 “拒絕” 響應。
表決階段中所有參與者都不會將數據更改持久化到數據庫中,而是保留在一個臨時狀態。
第二階段:執行階段
(1)事務協調者收到了所有參與者的 “準備好 " 響應,它會向所有參與者發送提交請求,告知參與者可以安全地將更改寫入數據庫
(2)參與者收到提交請求後,將更改持久化到數據庫並返回提交確認給事務協調者。
(3)如果事務協調者收到所有參與者的提交確認,它會宣佈事務提交成功。如果有任何參與者拒絕提交,協調者會發送回滾請求,要求所有參與者回滾之前的操作。
2PC 優點的具有簡單易理解(協議流程較爲簡單,易於實現和理解)、保證數據的一致性(所有參與者對於事務的提交或回滾保持一致)。同時它的缺點也很明顯,如阻塞(協調者崩潰時會導致參與者阻塞,無法繼續處理事務)、性能問題(2PC 需要多次網絡往返,可能影響性能)、故障恢復複雜(處理參與者或協調者崩潰後的恢復機制比較複雜)。
2、Seata-AT 模式
Seata-AT 模式幾個角色 TC、TM、RM,這幾個角色的概念如下所示:
(1)TC【事務協調器】
它是獨立的組件,需要獨立部署運行,Seata 提供了這個獨立運行的程序,它負責維護全局事務的運行狀態,接收 TM 指令發起全局事務的提交與回滾,負責與 RM 通信,協調各個分支事務的提交或回滾。
(2)TM【事務管理器】
TM 需要嵌入應用程序,它負責開啓一個全局事務,並定義全局事務的範圍,TM 目的是最終向 TC 發起全局提交或回滾指令。
(3)RM【資源管理器】
RM 與 TC 通信,控制分支事務,負責分支註冊、報告分支事務狀態,並接收事務協調器 TC 的指令,命令分支事務完成本地事務的提交或回滾。
通過 TC、TM、RM 的的相互協調配合實現了分佈式事務的處理,Seata-AT 模式的實現原理圖如下所示:
TM 負責定義全局事務的邊界,然後向 TC 申請開啓一個全局事務,全局事務創建成功後會生成全局唯一的 XID,這個 XID 會在微服務請求鏈路上下文中傳播。
Seata-AT 模式的第一階段的工作:
(1)通過攔截和解析業務 sql,然後根據解析 sql 語句中的條件生成查詢前的 sql 語句,將查詢結果當做快照後保存起來,後續如果事務回滾直接根據快照數據生成反向 sql 進行回滾操作。
(2)Seata 實現了 JDBC 協議,業務與數據庫交互首先要經過 Seata,這樣 Seata 對 sql 進行了攔截與處理,處理完成後將 sql 發送到真實數據庫執行。
由於上述操作在同一個本地事務中,那麼數據庫的事務特性保證數據的一致性。
Seata-AT 模式的第二階段工作:
對於 AT 模式,二階段提交主要是將每個事務的參與者的快照數據刪除,同時釋放行鎖;如果回滾,利用快照數據執行回滾。
在 AT 模式中,需要使用 Seata 組件中的 JDBC 代理數據源 DataSourceProxy,實現對真正目標數據源的代理訪問,通過代理實現攔截、解析 sql 的執行來實現快照數據的保存,如果業務執行成功,那麼就刪除快照數據,如果業務執行失敗就使用快照回滾。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/YyKRQqk50ZP8EqWT9ZTM4A