天天看點

深入淺出Seata的AT模式

單個掉隊,導緻集體被動擺爛;

一、業務背景

在分布式架構中,事務管理是個無法避開的複雜問題,雖然有多種解決方案,但是需要根據業務去選擇合适的;

從個人最近幾年的實踐經驗來看,Seata元件的AT模式比較常用,本文從實際的案例出發,來深入分析該模式的原理;

深入淺出Seata的AT模式

首先建立一個全局事務管理的接口,這裡是在Facade服務中開啟全局事務;

請求經過三個微服務,并且各個服務都進行資料源的操作,然後模拟鍊路成功和異常的情況,來分析不同狀态的邏輯實作;

二、Seata架構

1、核心元件

深入淺出Seata的AT模式

三大元件

  • TC:事務協調者

即Transaction Coordinator,維護全局和分支事務的狀态,驅動全局事務送出或復原。

  • TM:事務管理器

即Transaction Manager,定義全局事務的範圍,開始事務、送出事務,復原事務。

  • RM:資料總管

即Resource Manager,管理分支事務處理的資源,向TC注冊分支事務,報告分支事務的狀态,驅動分支事務送出或復原。

基礎互動

TC是需要獨立部署的服務,TM和RM是內建在服務中,三大元件互相協作,共同完成分布事務的管理;

2、AT模式

事務模型

AT是Seata預設的模式,需要基于支援本地ACID事務的關系型資料庫;Java應用,通過JDBC通路資料庫;基于案例流程,先分析AT的事務模型;

深入淺出Seata的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管理的全部分支事務送出或復原的排程;

核心機制

深入淺出Seata的AT模式

執行階段:每個微服務的請求完成後,基于本地資料庫的事務能力,保證業務資料和復原日志在同一個本地事務中送出,快速釋放連接配接和對資源的鎖定;

完成階段:全局送出時分支事務已經完成送出,會清理復原日志,快速結束流程;全局復原基于XID和BranchID查詢復原日志,完成資料復原;

資料源代理

深入淺出Seata的AT模式

在AT模式中,應用需要使用Seata元件中的JDBC代理資料源DataSourceProxy,實作對真正目标資料源的代理通路;

三、案例分析

1、流程分析

案例的簡單描述

深入淺出Seata的AT模式

在案例中涉及三個服務,Facade服務開啟全局事務,然後分别請求Account和Quartz服務的更新接口,通過Quartz接口是否抛異常來調試AT模式的原理;

深入淺出Seata的AT模式

從實際的請求執行來說,絕大多數的請求都是可以執行成功的,而AT模式的異步化送出極大限度的顧及全局事務的效率問題,少數失敗的情況也可以通過復原日志進行反向補償;

2、寫隔離

上述流程分析AT模式的原子性,即多個分支事務要麼都成功要麼都失敗,接下來分析多個事務中的全局鎖隔離機制,先看寫隔離,假設TX1先開始;

深入淺出Seata的AT模式

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語句的代理;

深入淺出Seata的AT模式

該語句的執行也需要擷取全局鎖,如果全局鎖被TX1持有,TX2會釋放本地鎖,查詢會被阻塞并進行重試,拿到全局鎖讀取成功後傳回;

四、對比XA模式

XA是一個分布式事務分段送出協定;事務管理器即TM:作為全局事務的排程者,負責整個事務中本地資源的送出和復原;本地資料總管即RM:大部分關系型資料庫都實作了XA接口;

深入淺出Seata的AT模式

TM先向所有的參與事務的RM發送确認請求,根據确認的結果,判斷是調用RM的commit送出還是rollback復原;

XA具有強一緻性,在2段送出的過程中,會持有資源的鎖,如果是在交易下單等複雜鍊路中,并且并發量很高,會存在長事務風險,XA無法滿足該類高并發的場景;

而在Seata的AT模式中,在服務執行完成後,直接進行RM送出和資源釋放,提供了對CAP理論相對平衡的解決方案,并且沒有侵入業務工程;

END

深入淺出Seata的AT模式

繼續閱讀