1、Seata 概述
Seata事務管理中有三個重要的角色:
-
TC (Transaction Coordinator) - **事務協調者:**維護全局和分支事務的狀態,協調全局事務提交或回滾。
-
TM (Transaction Manager) - **事務管理器:**定義全局事務的范圍、開始全局事務、提交或回滾全局事務。
-
RM (Resource Manager) - **資源管理器:**管理分支事務處理的資源,與TC交談以注冊分支事務和報告分支事務的狀態,并驅動分支事務提交或回滾。
整體的架構如圖:
Seata基于上述架構提供了四種不同的分布式事務模式解決方案:
- XA模式:強一致性分階段事務模式,犧牲了一定的可用性,無業務侵入
- TCC模式:最終一致的分階段事務模式,有業務侵入
- AT模式:最終一致的分階段事務模式,無業務侵入,也是Seata的默認模式
- SAGA模式:長事務模式,有業務侵入
無論哪種方案,都離不開TC,也就是事務的協調者。
1.1 微服務集成Seata
我們以order-service為例來演示。
1.1.1 引入依賴
首先,在order-service中引入依賴:
<!--seata-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><!--版本較低,1.3.0,因此排除--> <exclusion><artifactId>seata-spring-boot-starter</artifactId><groupId>io.seata</groupId></exclusion></exclusions>
</dependency>
<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><!--seata starter 采用1.4.2版本--><version>${seata.version}</version>
</dependency>
1.1.2 配置TC地址
在order-service中的application.yml中,配置TC服務信息,通過注冊中心nacos,結合服務名稱獲取TC地址:
seata:registry: # TC服務注冊中心的配置,微服務根據這些信息去注冊中心獲取tc服務地址type: nacos # 注冊中心類型 nacosnacos:server-addr: 127.0.0.1:8848 # nacos地址namespace: "" # namespace,默認為空group: DEFAULT_GROUP # 分組,默認是DEFAULT_GROUPapplication: seata-tc-server # seata服務名稱username: nacospassword: nacostx-service-group: seata-demo # 事務組名稱service:vgroup-mapping: # 事務組與cluster的映射關系seata-demo: SH
微服務根據這些配置尋找TC的地址:
從注冊到Nacos中的微服務,確定一個具體實例需要四個信息:
- namespace:命名空間
- group:分組
- application:服務名
- cluster:集群名
以上四個信息,在剛才的yaml文件中都能找到:
namespace為空,就是默認的public
結合起來,TC服務的信息就是:public@DEFAULT_GROUP@seata-tc-server@SH,這樣就能確定TC服務集群了。然后就可以去Nacos拉取對應的實例信息了。
1.2 XA模式
XA 規范 是 X/Open 組織定義的分布式事務處理(DTP,Distributed Transaction Processing)標準,XA 規范 描述了全局的TM與局部的RM之間的接口,幾乎所有主流的數據庫都對 XA 規范 提供了支持。
1.2.1 兩階段提交
XA是規范,目前主流數據庫都實現了這種規范,實現的原理都是基于兩階段提交。
正常情況:
異常情況:
一階段:
- 事務協調者通知每個事物參與者執行本地事務
- 本地事務執行完成后報告事務執行狀態給事務協調者,此時事務不提交,繼續持有數據庫鎖
二階段:
- 事務協調者基于一階段的報告來判斷下一步操作
- 如果一階段都成功,則通知所有事務參與者,提交事務
- 如果一階段任意一個參與者失敗,則通知所有事務參與者回滾事務
1.2.2 Seata的XA模型
Seata對原始的XA模式做了簡單的封裝和改造,以適應自己的事務模型,基本架構如圖:
RM一階段的工作:
? ① 注冊分支事務到TC
? ② 執行分支業務sql但不提交
? ③ 報告執行狀態到TC
TC二階段的工作:
-
TC檢測各分支事務執行狀態
a.如果都成功,通知所有RM提交事務
b.如果有失敗,通知所有RM回滾事務
RM二階段的工作:
- 接收TC指令,提交或回滾事務