分布式事務的解決方案—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的執行來實現快照數據的保存,如果業務執行成功,那么就刪除快照數據,如果業務執行失敗就使用快照回滾。