分佈式事務 Seata-AT 模式

Seata 是開源的分佈式事務解決方案,提供高性能和簡單易用的分佈式事務服務,包含 AT、TCC、 SAGA、XA 四種事務模式,爲用戶打造一站式的分佈式解決方案。

Seata 提供的 4 種事務模式都是由 2PC(二階段提交)轉換過來的。

在介紹該流程之前,先了解下 3 個 Seata 角色,

在事務開始之前,TM 和所有的 RM 都需要先註冊到 TC。

註冊以後,用戶發起請求到 TM(business),TM 開啓全局事務和進行遠程調用庫存(庫存減 1)和訂單服務(加 1),再由訂單遠程調用用戶服務(加積分)。

TM 是整個事務的入口,全局事務或分佈式事務的開啓者。

TC 就是 Seata Server,TC 是統籌者,所有的分支事務都需要註冊到 TC 上。

註冊之後,由事務發起者來發送對應的請求,告訴每個執行者開始執行業務,無論成功或失敗,都會發送消息通知 TC,最後由 TC 告訴所有 RM 是提交還是回滾。

Seata配置Nacos作爲註冊中心和配置中心

Seata 集羣存儲事務的數據,通過 db 數據庫的方式存儲數據。

Nacos 可以完成對 Seata 集羣的負載均衡。

用 Seata 管理分佈式事務,通過 TC 來統籌 RM,事務的參與者 RM 是 Seata 的客戶端,TC 是 Server 端,Server 和 Client 端要註冊到同一個 namespace 中。

Seata AT 模式是二階段提交模式的演變,是無侵入的分佈式事務解決方案,在 AT 模式下,一階段用戶只需要關注自己的業務 sql,Seata 框架會自動生成事務的第二階段進行提交或回滾操作。

一階段,會攔截業務 sql(比如訂單先調用庫存(庫存減 1),再生成訂單),Seata 解析 sql 語句,同時要找到當前要更新的業務數據,比如庫存減 1,在數據被更新前,保存 undolog 日誌,再執行業務 sql,更新之後的數據再保存到 redolog 日誌。

如果一階段某個服務的本地事務沒有通過,就全局回滾,讓當前所有數據回滾到開始之前的狀態,否則就提交全局事務。

回滾的時候所用到的數據就在 undolog,即在數據被正式更新之前所保存下來的原數據作爲回滾的依據,通過回滾反向生成 sql 完成分支事務的回滾,事務結束後會釋放所有資源和刪除所有日誌。

AT模式詳細分解

訂單服務執行本地事務訂單 + 1,庫存服務執行本地事務庫存減 1。

TM 發起全局事務的執行,不同的分支事務需要執行自己的本地事務。

訂單服務既是 RM 又是 TM,在訂單開啓全局事務,遠程調用庫存服務,又要執行本地事務訂單 + 1。

Order 告訴 TC 我要開始執行分支事務了,Stock 也要開始執行分支事務,兩個 RM 開始執行自己的分支事務。

Order 註冊分支事務,記錄 undolog,即在真正執行分支事務(本地事務)數據更改之前的數據要記錄在 undolog 中,更改之後的數據要記錄在 redolog 中。

Order 開啓遠程調用 Stock,Stock 也一樣開始註冊自己的本地事務,記錄更改之前的數據到 undolog,記錄更改之後的數據到 redolog。

2 個分支事務執行完之後,需要告訴 TC 當前這 2 個事務的執行狀態,TC 如果收到了 2 個 RM 都執行成功的消息,第二階段就做全局的提交,否則全局回滾。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/3AyBCsYIeAFeKCNq6fdMCQ