一、引言:微服務(wù)與分布式事務(wù)的挑戰(zhàn)
在微服務(wù)架構(gòu)中,業(yè)務(wù)邏輯被拆分為多個(gè)獨(dú)立部署的服務(wù),每個(gè)服務(wù)擁有獨(dú)立的數(shù)據(jù)庫(kù)。當(dāng)一項(xiàng)業(yè)務(wù)操作需要跨多個(gè)服務(wù)更新數(shù)據(jù)時(shí),如何保證所有服務(wù)的數(shù)據(jù)一致性,成為一個(gè)核心挑戰(zhàn)。傳統(tǒng)單機(jī)數(shù)據(jù)庫(kù)的事務(wù)(ACID)無(wú)法直接跨越服務(wù)邊界,這就是分布式事務(wù)問(wèn)題。
阿里巴巴開(kāi)源的 Seata(Simple Extensible Autonomous Transaction Architecture) 應(yīng)運(yùn)而生,它旨在以高性能和低侵入的方式,解決微服務(wù)架構(gòu)下的分布式事務(wù)難題。
二、Seata 核心架構(gòu)與核心概念
Seata 的設(shè)計(jì)包含三大核心角色:
- Transaction Coordinator (TC): 事務(wù)協(xié)調(diào)器。它是獨(dú)立部署的服務(wù)器,負(fù)責(zé)維護(hù)全局事務(wù)和分支事務(wù)的狀態(tài),驅(qū)動(dòng)全局事務(wù)的提交或回滾。這是Seata的大腦。
- Transaction Manager (TM): 事務(wù)管理器。它嵌入在微服務(wù)應(yīng)用中,負(fù)責(zé)定義全局事務(wù)的邊界,開(kāi)啟、提交或回滾全局事務(wù)。TM與TC通信。
- Resource Manager (RM): 資源管理器。它也嵌入在應(yīng)用中,負(fù)責(zé)管理分支事務(wù)(即本地事務(wù))相關(guān)的資源,向TC注冊(cè)分支事務(wù)、報(bào)告分支事務(wù)狀態(tài),并驅(qū)動(dòng)分支事務(wù)的提交和回滾。
一個(gè)典型的工作流程是:TM向TC申請(qǐng)開(kāi)啟一個(gè)全局事務(wù),生成全局唯一的XID。XID在微服務(wù)調(diào)用鏈中傳播。RM在執(zhí)行業(yè)務(wù)SQL時(shí),會(huì)向TC注冊(cè)分支事務(wù),并將數(shù)據(jù)的前后鏡像(undo log)保存起來(lái)。TM根據(jù)業(yè)務(wù)結(jié)果向TC發(fā)起全局提交或回滾決議,TC驅(qū)動(dòng)所有相關(guān)的RM完成最終的數(shù)據(jù)提交或回滾(利用undo log進(jìn)行補(bǔ)償)。
三、Seata 支持的分布式事務(wù)模式詳解
Seata提供了四種主要的分布式事務(wù)解決方案,以適應(yīng)不同的業(yè)務(wù)場(chǎng)景。
1. AT 模式(默認(rèn)且最常用)
AT模式是Seata主推的無(wú)侵入解決方案。它基于兩階段提交(2PC)演進(jìn)而來(lái),但對(duì)應(yīng)用代碼幾乎零侵入。
- 工作原理:
- 第一階段:執(zhí)行業(yè)務(wù)SQL,提交本地事務(wù),并生成行數(shù)據(jù)的前鏡像和后鏡像作為回滾日志(undo log),存入本地?cái)?shù)據(jù)庫(kù)。然后向TC報(bào)告就緒狀態(tài)。
- 第二階段:
- 提交:TC收到提交指令后,異步、快速地刪除各分支的undo log即可。
- 回滾:TC收到回滾指令后,RM根據(jù)XID查找undo log,生成反向更新SQL(利用前鏡像)進(jìn)行數(shù)據(jù)還原,然后刪除undo log。
- 優(yōu)點(diǎn):對(duì)代碼無(wú)侵入、性能好、使用簡(jiǎn)單。
- 缺點(diǎn):需要支持本地ACID事務(wù)的關(guān)系型數(shù)據(jù)庫(kù),且全局鎖機(jī)制在高并發(fā)下可能影響性能。
2. TCC 模式
TCC是一種侵入性較強(qiáng)但更靈活的模式,適用于對(duì)一致性要求高、且有復(fù)雜業(yè)務(wù)補(bǔ)償邏輯的場(chǎng)景(如涉及非事務(wù)型資源)。
- 工作原理:將業(yè)務(wù)邏輯拆分為三個(gè)操作:
- Try:預(yù)留業(yè)務(wù)資源(如凍結(jié)賬戶金額、鎖定庫(kù)存)。
- Confirm:確認(rèn)執(zhí)行業(yè)務(wù),使用Try階段預(yù)留的資源(如扣減凍結(jié)金額)。
- Cancel:取消執(zhí)行,釋放Try階段預(yù)留的資源(如解凍金額)。
- Seata的TCC框架負(fù)責(zé)管理TCC分支的注冊(cè)、報(bào)告,以及Confirm/Cancel的調(diào)用。
- 優(yōu)點(diǎn):完全由業(yè)務(wù)控制,可以跨非事務(wù)型資源,鎖粒度小,性能潛力高。
- 缺點(diǎn):代碼侵入性強(qiáng),需要為每個(gè)業(yè)務(wù)設(shè)計(jì)Try/Confirm/Cancel接口,開(kāi)發(fā)復(fù)雜度高。
3. Saga 模式
Saga模式適用于業(yè)務(wù)流程長(zhǎng)、需要跨多個(gè)服務(wù)、且后續(xù)服務(wù)可補(bǔ)償?shù)膱?chǎng)景。
- 工作原理:將一個(gè)長(zhǎng)事務(wù)拆分為一系列本地事務(wù)。每個(gè)本地事務(wù)都有對(duì)應(yīng)的補(bǔ)償事務(wù)。Saga協(xié)調(diào)器按順序執(zhí)行所有本地事務(wù),如果其中任何一個(gè)失敗,則按相反順序執(zhí)行已成功事務(wù)的補(bǔ)償事務(wù),將系統(tǒng)狀態(tài)回滾到事務(wù)開(kāi)始之前。
- Seata的Saga狀態(tài)機(jī)通過(guò)配置JSON文件來(lái)定義服務(wù)調(diào)用和補(bǔ)償調(diào)用的順序,實(shí)現(xiàn)服務(wù)編排。
- 優(yōu)點(diǎn):適用于長(zhǎng)時(shí)間事務(wù),參與者異步執(zhí)行,無(wú)全局鎖,吞吐量高。
- 缺點(diǎn):不保證隔離性(可能出現(xiàn)“臟寫”),需要業(yè)務(wù)方設(shè)計(jì)冪等的正向操作和補(bǔ)償操作。
4. XA 模式
XA模式是分布式事務(wù)的經(jīng)典規(guī)范,基于數(shù)據(jù)庫(kù)或資源本身提供的XA協(xié)議實(shí)現(xiàn)。
- 工作原理:同樣是兩階段提交,但依賴數(shù)據(jù)庫(kù)的XA驅(qū)動(dòng)。第一階段,所有參與者(RM)執(zhí)行SQL但不提交,將狀態(tài)告知TC;第二階段,TC根據(jù)決議通知所有參與者提交或回滾。
- Seata充當(dāng)了XA協(xié)議中事務(wù)管理器(TM)的角色,統(tǒng)一管理XA事務(wù)。
- 優(yōu)點(diǎn):強(qiáng)一致,對(duì)業(yè)務(wù)代碼零侵入,得到主流數(shù)據(jù)庫(kù)的廣泛支持。
- 缺點(diǎn):數(shù)據(jù)在第一階段后即被鎖定,直到第二階段完成才釋放,對(duì)資源鎖定時(shí)間長(zhǎng),性能較差。
四、與消息隊(duì)列的集成實(shí)現(xiàn)最終一致性
除了Seata提供的強(qiáng)一致性/柔性事務(wù)方案,在微服務(wù)中,消息隊(duì)列(如RocketMQ) 是另一種極為常見(jiàn)的實(shí)現(xiàn)最終一致性的模式,常與本地事務(wù)表結(jié)合使用。
其核心思想是:將分布式事務(wù)拆分為一系列本地事務(wù),并通過(guò)可靠消息進(jìn)行異步協(xié)調(diào)。例如:
- 服務(wù)A執(zhí)行本地事務(wù),向本地“事務(wù)消息表”插入一條記錄(狀態(tài)為“待發(fā)送”),并提交。
- 一個(gè)后臺(tái)進(jìn)程輪詢?cè)摫恚瑢ⅰ按l(fā)送”的消息投遞到消息隊(duì)列。
- 消息隊(duì)列確保消息成功投遞給服務(wù)B。
- 服務(wù)B消費(fèi)消息,執(zhí)行本地事務(wù)。若成功,則向消息隊(duì)列返回ACK;若失敗,消息會(huì)重投或進(jìn)入死信隊(duì)列人工處理。
- 服務(wù)A收到消費(fèi)成功的確認(rèn)后,更新本地消息狀態(tài)為“已發(fā)送”。
這種方式與Seata的Saga模式有相似之處,但更依賴于MQ的可靠性和業(yè)務(wù)的冪等設(shè)計(jì)。Seata可以與消息隊(duì)列結(jié)合,例如在Saga模式中,使用消息來(lái)驅(qū)動(dòng)服務(wù)間的調(diào)用。
五、在信息系統(tǒng)集成服務(wù)中的應(yīng)用考量
在企業(yè)級(jí)信息系統(tǒng)集成服務(wù)中,選擇合適的分布式事務(wù)方案是關(guān)鍵決策。
- 金融、交易核心系統(tǒng):對(duì)一致性要求極高,可優(yōu)先考慮TCC模式(控制精準(zhǔn))或XA模式(強(qiáng)一致),但需評(píng)估性能損失。AT模式在多數(shù)交易場(chǎng)景下也是可靠選擇。
- 電商、訂單履約等長(zhǎng)流程業(yè)務(wù):涉及庫(kù)存、訂單、物流等多個(gè)系統(tǒng),流程長(zhǎng),Saga模式或基于消息隊(duì)列的最終一致性模型更為合適,它們能提供更好的系統(tǒng)吞吐量和靈活性。
- 遺留系統(tǒng)集成:對(duì)于無(wú)法改造的“黑盒”系統(tǒng),可能只能通過(guò)消息隊(duì)列實(shí)現(xiàn)外部集成,保證最終一致。
- 混合模式:一個(gè)復(fù)雜的集成項(xiàng)目中,可以混合使用多種模式。例如,核心扣款用TCC,積分發(fā)放用消息隊(duì)列最終一致。Seata框架本身支持多種模式并存。
六、
Seata作為阿里貢獻(xiàn)的成熟分布式事務(wù)解決方案,通過(guò)AT、TCC、Saga、XA四種模式,覆蓋了從強(qiáng)一致到最終一致、從代碼無(wú)侵入到高度可控的各種業(yè)務(wù)場(chǎng)景。它降低了微服務(wù)下處理分布式事務(wù)的技術(shù)門檻。在實(shí)際的信息系統(tǒng)集成服務(wù)設(shè)計(jì)中,開(kāi)發(fā)者需要深刻理解各模式的原理、優(yōu)缺點(diǎn),并結(jié)合具體的業(yè)務(wù)特征(一致性要求、性能要求、系統(tǒng)改造難度)進(jìn)行技術(shù)選型,必要時(shí)可以組合多種模式,以構(gòu)建穩(wěn)定、高效、可擴(kuò)展的分布式系統(tǒng)。