單個掉隊,導緻集體被動擺爛;
一、業務背景
在分布式架構中,事務管理是個無法避開的複雜問題,雖然有多種解決方案,但是需要根據業務去選擇合适的;
從個人最近幾年的實踐經驗來看,Seata元件的AT模式比較常用,本文從實際的案例出發,來深入分析該模式的原理;
首先建立一個全局事務管理的接口,這裡是在Facade服務中開啟全局事務;
請求經過三個微服務,并且各個服務都進行資料源的操作,然後模拟鍊路成功和異常的情況,來分析不同狀态的邏輯實作;
二、Seata架構
1、核心元件
三大元件
- TC:事務協調者
即Transaction Coordinator,維護全局和分支事務的狀态,驅動全局事務送出或復原。
- TM:事務管理器
即Transaction Manager,定義全局事務的範圍,開始事務、送出事務,復原事務。
- RM:資料總管
即Resource Manager,管理分支事務處理的資源,向TC注冊分支事務,報告分支事務的狀态,驅動分支事務送出或復原。
基礎互動
TC是需要獨立部署的服務,TM和RM是內建在服務中,三大元件互相協作,共同完成分布事務的管理;
2、AT模式
事務模型
AT是Seata預設的模式,需要基于支援本地ACID事務的關系型資料庫;Java應用,通過JDBC通路資料庫;基于案例流程,先分析AT的事務模型;
2.1 TM負責定義全局事務的邊界,向TC申請,開啟一個全局事務;
2.2 全局事務建立成功後,生成全局唯一的XID;
2.3 XID會在微服務請求鍊路上下文中傳播;
2.4 RM向TC注冊分支事務,并歸屬到XID對應的全局事務進行排程;
2.5 TM向TC發起相應XID的全局事務送出或復原決議;
2.6 TC完成對XID管理的全部分支事務送出或復原的排程;
核心機制
執行階段:每個微服務的請求完成後,基于本地資料庫的事務能力,保證業務資料和復原日志在同一個本地事務中送出,快速釋放連接配接和對資源的鎖定;
完成階段:全局送出時分支事務已經完成送出,會清理復原日志,快速結束流程;全局復原基于XID和BranchID查詢復原日志,完成資料復原;
資料源代理
在AT模式中,應用需要使用Seata元件中的JDBC代理資料源DataSourceProxy,實作對真正目标資料源的代理通路;
三、案例分析
1、流程分析
案例的簡單描述
在案例中涉及三個服務,Facade服務開啟全局事務,然後分别請求Account和Quartz服務的更新接口,通過Quartz接口是否抛異常來調試AT模式的原理;
從實際的請求執行來說,絕大多數的請求都是可以執行成功的,而AT模式的異步化送出極大限度的顧及全局事務的效率問題,少數失敗的情況也可以通過復原日志進行反向補償;
2、寫隔離
上述流程分析AT模式的原子性,即多個分支事務要麼都成功要麼都失敗,接下來分析多個事務中的全局鎖隔離機制,先看寫隔離,假設TX1先開始;
TX1邏輯
- TX1開始本地事務,拿到本地鎖,然後執行更新操作;
- TX1本地事務送出前,需要先擷取全局鎖,否則無法送出;
- TX1擷取全局鎖并送出,釋放本地鎖,但未釋放全局鎖;
TX2邏輯
- TX2此時開始本地事務,拿到本地鎖;
- TX2執行本地事務送出前,嘗試擷取全局鎖;
- 由于全局鎖被TX1持有,TX2會重試等待全局鎖;
假設TX1全局送出
- TX1如果全局事務送出,會釋放全局鎖;
- TX2擷取全局鎖成功,執行本地事務送出;
假設TX1全局復原
- TX1如果全局事務復原,要重新擷取資料的本地鎖,進行復原的補償動作;
- TX2如果仍在等待全局鎖,并且還持有本地鎖,TX1事務復原失敗,會不斷的重試;
- 當TX2等待全局鎖逾時,會放棄全局鎖并復原本地事務,釋放本地鎖;
- TX1最終擷取資料的本地鎖,完成復原動作;
在該過程中,TX1在結束前一直持有全局鎖,TX2擷取不到全局鎖無法對相同的資料執行更新動作,是以避免了髒寫的問題;
3、讀隔離
在資料庫本地隔離級别為讀已送出或以上的基礎上,Seata的AT模式預設全局隔離級别是讀未送出;如果需要全局的讀已送出,可以通過SELECT FOR UPDATE語句的代理;
該語句的執行也需要擷取全局鎖,如果全局鎖被TX1持有,TX2會釋放本地鎖,查詢會被阻塞并進行重試,拿到全局鎖讀取成功後傳回;
四、對比XA模式
XA是一個分布式事務分段送出協定;事務管理器即TM:作為全局事務的排程者,負責整個事務中本地資源的送出和復原;本地資料總管即RM:大部分關系型資料庫都實作了XA接口;
TM先向所有的參與事務的RM發送确認請求,根據确認的結果,判斷是調用RM的commit送出還是rollback復原;
XA具有強一緻性,在2段送出的過程中,會持有資源的鎖,如果是在交易下單等複雜鍊路中,并且并發量很高,會存在長事務風險,XA無法滿足該類高并發的場景;
而在Seata的AT模式中,在服務執行完成後,直接進行RM送出和資源釋放,提供了對CAP理論相對平衡的解決方案,并且沒有侵入業務工程;
END