javascript
Spring Cloud Alibaba —— Seata 分布式事务框架
導(dǎo)航
- 一、Seata 介紹
- 二、Seata 的工作原理
- 2.1 三個(gè)角色
- 2.2 工作流程
- 三、Seata AT 工作機(jī)制
- 3.1 一階段
- 3.2 二階段
- 四、案例演示(待補(bǔ)充)
一、Seata 介紹
官網(wǎng):Seata 官網(wǎng)
Seata 是2019 年阿里巴巴中間件團(tuán)隊(duì)發(fā)起的開(kāi)源項(xiàng)目,其前身是 Fescar(Fast & EaSy Commit And Rollback)。其愿景是讓分布式的使用像本地事務(wù)的使用一樣簡(jiǎn)單、高效,并逐步解決開(kāi)發(fā)者遇到的分布式事務(wù)方面的所有難題。
Seata 意為 Simple Extensible Autonomous Transaction Architecture,簡(jiǎn)單可擴(kuò)展自治分布式框架。
Seata 的設(shè)計(jì)目標(biāo)是對(duì)業(yè)務(wù)無(wú)侵入,因此從業(yè)務(wù)無(wú)侵入的 2PC 方案入手,在傳統(tǒng) 2PC 的基礎(chǔ)上擴(kuò)展,把一個(gè)分布式事務(wù)理解成一個(gè)包含若干分支事務(wù)的全局事務(wù)
二、Seata 的工作原理
2.1 三個(gè)角色
1、TC:Transaction Coordinator 事務(wù)協(xié)調(diào)器,管理全局的分支事務(wù)狀態(tài),用于全局性事務(wù)的提交和回滾。
2、TM:Transaction Manager 事務(wù)管理器,用于開(kāi)啟、提交或回滾全局事務(wù)。
3、RM:Resource Manager 資源管理器,用于分支事務(wù)上的資源管理,向 TC 注冊(cè)分支事務(wù),上報(bào)分支事務(wù)的狀態(tài),接收 TC 的命令來(lái)提交或回滾分支事務(wù)。
2.2 工作流程
假設(shè)上圖中的三個(gè)服務(wù)根據(jù)調(diào)用關(guān)系為 A–> B–>C,那么 Seata 的執(zhí)行流程如下:
1、A 服務(wù)的TM 向TC申請(qǐng)開(kāi)啟一個(gè)全局事務(wù),TC會(huì)創(chuàng)建一個(gè)全局事務(wù)并返回一個(gè) 唯一的 XID。
2、A 服務(wù)的 RM向 TC注冊(cè)分支事務(wù),并將其納入 XID 對(duì)應(yīng)全局事務(wù)的管轄。
3、A 服務(wù)執(zhí)行分支事務(wù),操作數(shù)據(jù)庫(kù)。
4、A 服務(wù)開(kāi)始遠(yuǎn)程調(diào)用 B 服務(wù),此時(shí)XID 會(huì)在微服務(wù)的調(diào)用鏈上傳播。
5、B 服務(wù)的 RM 向TC 注冊(cè)分支事務(wù),并將其納入 XID 對(duì)應(yīng)的全局事務(wù)的管轄。
6、B 服務(wù)執(zhí)行分支事務(wù),操作數(shù)據(jù)庫(kù)。
7、全局事務(wù)調(diào)用鏈處理完畢,TM 根據(jù)有無(wú)異常向 TC 發(fā)起全局事務(wù)的提交或回滾。
8、TC 協(xié)調(diào)其管轄下的所有分支事務(wù),決定是否回滾。
Seata 實(shí)現(xiàn) 2PC 與傳統(tǒng) 2PC 的區(qū)別:
1、架構(gòu)層次方面,傳統(tǒng) 2PC 方案的 RM 實(shí)際上是在數(shù)據(jù)庫(kù)層,RM 本質(zhì)就是數(shù)據(jù)庫(kù),通過(guò) XA 協(xié)議實(shí)現(xiàn),而 Seata 的 RM 是以 jar 包的形式作為中間件層部署在應(yīng)用程序這一側(cè)的。
2、兩階段提交方面,傳統(tǒng) 2PC 無(wú)論第二階段的決議是 commit 還是 rollback ,事務(wù)性資源的鎖都要保持到 Phase 2 完成才釋放。而 Seata 的做法是在 Phase 1 就將本地事務(wù)提交,這樣就可以省去 Phase 2 持鎖的時(shí)間,整體提高效率。
三、Seata AT 工作機(jī)制
Seata 在 2PC 提交模型的基礎(chǔ)上進(jìn)行了演進(jìn),視為 Seata AT 模式。除此之外,還有 Seata TCC模式、Seata XA 模式等。
Seata AT 模式非常簡(jiǎn)單,也是兩階段提交。
下面以一個(gè)簡(jiǎn)單示例說(shuō)明整體 AT 模式的工作機(jī)制,參考原文:Seata AT 模式
3.1 一階段
商品表:product :
| id | bigint(20) | PRI |
| name | varchar(100) | |
| since | varchar(100) |
業(yè)務(wù)邏輯:
update product set name = 'GTS' where name = 'TXC';1、解析SQL:得到 Sql 類(lèi)型(update),表(product),條件等信息。
2、查詢(xún)前鏡像:根據(jù)解析得到的條件,生成查詢(xún)語(yǔ)句,定位數(shù)據(jù):
| 1 | TXC | 2014 |
3、執(zhí)行業(yè)務(wù) SQL:更新這條記錄的 name 為 ‘GTS’。
4、查詢(xún)后鏡像:根據(jù)前鏡像的結(jié)果,通過(guò) 主鍵 定位數(shù)據(jù)。
| 1 | GTS | 2014 |
5、插入回滾日志:把前后鏡像數(shù)據(jù)以及業(yè)務(wù) SQL 相關(guān)的信息組成一條回滾日志記錄,插入到 UNDO_LOG 表中。
{"branchId": 641789253,"undoItems": [{"afterImage": {"rows": [{"fields": [{"name": "id","type": 4,"value": 1}, {"name": "name","type": 12,"value": "GTS"}, {"name": "since","type": 12,"value": "2014"}]}],"tableName": "product"},"beforeImage": {"rows": [{"fields": [{"name": "id","type": 4,"value": 1}, {"name": "name","type": 12,"value": "TXC"}, {"name": "since","type": 12,"value": "2014"}]}],"tableName": "product"},"sqlType": "UPDATE"}],"xid": "xid:xxx" }6、提交前,向 TC 注冊(cè)分支:申請(qǐng) product 表中,主鍵值等于 1 的記錄的 全局鎖 。
7、本地事務(wù)提交:業(yè)務(wù)數(shù)據(jù)的更新和前面步驟中生成的 UNDO LOG 一并提交。
8、將本地事務(wù)提交的結(jié)果上報(bào)給 TC。
3.2 二階段
回滾
1、收到 TC 的分支回滾請(qǐng)求,開(kāi)啟一個(gè)本地事務(wù),執(zhí)行如下操作。
2、通過(guò) XID 和 Branch ID 查找到相應(yīng)的 UNDO LOG 記錄。
3、數(shù)據(jù)校驗(yàn):拿 UNDO LOG 中的后鏡與當(dāng)前數(shù)據(jù)進(jìn)行比較,如果有不同,說(shuō)明數(shù)據(jù)被當(dāng)前全局事務(wù)之外的動(dòng)作做了修改。這種情況,需要根據(jù)配置策略來(lái)做處理,詳細(xì)的說(shuō)明在另外的文檔中介紹。
4、根據(jù) UNDO LOG 中的前鏡像和業(yè)務(wù) SQL 的相關(guān)信息生成并執(zhí)行回滾的語(yǔ)句:
5、提交本地事務(wù)。并把本地事務(wù)的執(zhí)行結(jié)果(即分支事務(wù)回滾的結(jié)果)上報(bào)給 TC。
提交
1、收到 TC 的分支提交請(qǐng)求,把請(qǐng)求放入一個(gè)異步任務(wù)的隊(duì)列中,馬上返回提交成功的結(jié)果給 TC。
2、異步任務(wù)階段的分支提交請(qǐng)求將異步和批量地刪除相應(yīng) UNDO LOG 記錄。
四、案例演示(待補(bǔ)充)
演示一個(gè)電商下訂單扣庫(kù)存的應(yīng)用案例,看下 Seata 是如何使用的。
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud Alibaba —— Seata 分布式事务框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php数组在golang,go语言数据类
- 下一篇: charles 安装 ssl_「从零开始