學(xué)習(xí)資源來(lái)自姜宇的《正本清源分布式事務(wù)之Seata》
Seata是阿里開(kāi)源的分布式事務(wù)解決方案。
2.1 Seata總體架構(gòu)
2.1.1 模塊組成
Seata的目錄結(jié)構(gòu)說(shuō)明如下:
- all: 只有一個(gè)pom文件,指定了Seata依賴(lài)的包。
- bom: 只有一個(gè)pom文件票编,指定了Seata依賴(lài)包的版本陷遮。
- changes: md文件描述版本變更情況挠乳。
- common: 通用模塊。包括通用工具類(lèi)讼呢、線程工具撩鹿、異常、加載類(lèi)等悦屏。
- compressor: 壓縮模塊节沦。封裝了各種壓縮剩下,比如Zip础爬、Gzip甫贯、7z、Lz4幕帆、Bzip2等获搏,部分通過(guò)引入第三方依賴(lài)實(shí)現(xiàn),此模塊主要用于消息壓縮失乾。
- config: 配置模塊常熙。用于連接和操作配置中心,支持Nacos碱茁、Apollo裸卫、Etcd、Consul纽竣、ZooKeeper等墓贿。
- console: 用戶(hù)控制臺(tái)。應(yīng)該是最近新加的模塊蜓氨,目前源碼來(lái)看只是用于查看Seata是否還活著聋袋。
- core: 核心模塊。定義了RPC穴吹、Nety幽勒、事件、協(xié)議港令、事務(wù)上下文等啥容。
- discovery: 發(fā)現(xiàn)模塊。用于服務(wù)發(fā)現(xiàn)顷霹,支持Nacos咪惠、Etcd、Eureka淋淀、Redis遥昧、ZooKeeper等。
- distribution: 只有一個(gè)pom文件,用于打包發(fā)布渠鸽。
- ext/apm-seata-skywalking-plugin: 應(yīng)該是用于對(duì)skywalking監(jiān)控的支持叫乌。
- integration: 整合模塊。整合了Seata對(duì)多種RPC框架的支持徽缚,包括Dubbo、gRPC革屠、SOFA-RPC等凿试。用來(lái)實(shí)現(xiàn)Seata事務(wù)上下文在RPC框架的傳遞。
- metrics: 度量模塊似芝。用于收集一些Seata運(yùn)行指標(biāo)數(shù)據(jù)那婉,并導(dǎo)出到監(jiān)控系統(tǒng)(如Prometheus)。
- rm: 資源管理模塊党瓮。定義了多種類(lèi)型資源管理器的公共組件详炬,包括AT模式、TCC模式寞奸、Saga模式呛谜、XA模式的資源管理器。
- rm-datasource: AT模式的資源管理器模塊枪萄。實(shí)現(xiàn)了AT模式的數(shù)據(jù)源代理隐岛、SQL語(yǔ)句處理等。該模塊也包括對(duì)XA模式的支持瓷翻。
- saga: Saga模式的資源管理器模塊聚凹。用來(lái)實(shí)現(xiàn)對(duì)Saga模式事務(wù)的支持。
- script: 腳本模塊齐帚。定義了需要的腳本文件和配置文件妒牙。
- seata-plugin: seata的一些插件定制,目前里面只有一個(gè)OracleTimestampJacksonSerializer
- seata-spring-autoconfigure: spring自動(dòng)裝配
- seata-spring-boot-starter: 用于與Spring Boot結(jié)合对妄,簡(jiǎn)化使用湘今。
- serializer: 序列化模塊。用于Seata消息序列化和反序列化饥伊,支持多種協(xié)議象浑,包括Seata私有的序列化協(xié)議、FST琅豆、Hessian愉豺、Kryo等。
- server: 服務(wù)端模塊茫因。用來(lái)實(shí)現(xiàn)事務(wù)協(xié)調(diào)器蚪拦,維護(hù)全局事務(wù)和分布式事務(wù)的狀態(tài),推進(jìn)事務(wù)兩階段提交/回滾。
- spring: Spring支持模塊驰贷。定義了Seata事務(wù)注解盛嘿。
- sqlparser: SQL解析模塊。Seata使用Druid SQL解釋器括袒。
- style: 定義了代碼規(guī)范次兆。
- tcc: TCC模式資源管理器模塊。用來(lái)實(shí)現(xiàn)對(duì)TCC事務(wù)模式的支持锹锰。
- test: 測(cè)試模塊芥炭。
- tm: 事務(wù)協(xié)調(diào)器模塊。定義了全局事務(wù)的范圍恃慧、開(kāi)啟全局事務(wù)园蝠、提交/回滾全局事務(wù)。
斜體部分是我自己補(bǔ)充的痢士,書(shū)中并沒(méi)有彪薛。
2.1.2 邏輯結(jié)構(gòu)
Seata有3個(gè)主要角色:TM(事務(wù)管理器Transaction Manager)、RM(資源管理器Resource Manager)和TC(事務(wù)協(xié)調(diào)器Transaction Coordinator)怠蹂。
其中善延,TM和RM是以SDK的形式作為Seata的客戶(hù)端與業(yè)務(wù)系統(tǒng)集成在一起,TC作為Seata的服務(wù)的獨(dú)立部署褥蚯。
Seata處理分布式事務(wù)的主要流程:
(1) TM開(kāi)啟全局事務(wù)(TM向TC發(fā)起)挚冤。
(2) 事務(wù)參與者(應(yīng)用)通過(guò)RM與資源交互(本地?cái)?shù)據(jù)庫(kù)執(zhí)行事務(wù)但不提交),并注冊(cè)分支事務(wù)(RM向TC注冊(cè)分支事務(wù))赞庶。
(3) 事務(wù)參與者在完成資源操作后(提交)训挡,上報(bào)分支事務(wù)狀態(tài)(RM向TC上報(bào)分支事務(wù)狀態(tài))
(4) TM結(jié)束全局事務(wù),事務(wù)一階段結(jié)束(TM向TC發(fā)起提交/回滾全局事務(wù))歧强。
(5) TC推進(jìn)事務(wù)二階段操作(TC向TM發(fā)起二階段提交/回滾)澜薄。
書(shū)中后面的篇章主要詳細(xì)介紹AT和TCC模式,分布式事務(wù)流程大體一致摊册,后面會(huì)有針對(duì)具體模式的詳細(xì)流程肤京。
2.2 Seata事務(wù)模式
Seata支持4中事務(wù)模式:AT、TCC茅特、Saga忘分、XA。
2.2.1 AT模式
AT模式是Seata主推的分布式事務(wù)解決方案白修,對(duì)業(yè)務(wù)無(wú)侵入妒峦,真正做到業(yè)務(wù)與事務(wù)分離,用戶(hù)只需關(guān)注自己的“業(yè)務(wù)SQL語(yǔ)句”兵睛。
AT模式使用起來(lái)非常簡(jiǎn)單肯骇,與完全沒(méi)有使用分布式事務(wù)方案相比窥浪,業(yè)務(wù)邏輯不需要修改,只需要增加注解@GlobalTransactional即可笛丙。
2.2.2 TCC模式
TCC模式需要用戶(hù)根據(jù)自己的業(yè)務(wù)場(chǎng)景實(shí)現(xiàn)try()漾脂、confirm()和cancel()3個(gè)方法:事務(wù)發(fā)起方在一階段執(zhí)行try()方法,二階段提交執(zhí)行confirm()方法胚鸯,回滾執(zhí)行cancel()方法骨稿。
TCC模式與AT模式的主要區(qū)別:
(1) 在使用上,TCC模式依賴(lài)用戶(hù)自行實(shí)現(xiàn)3個(gè)方法蠢琳,成本較大啊终;AT模式依賴(lài)全局事務(wù)注解和代理數(shù)據(jù)源,自動(dòng)完成分布式事務(wù)的處理傲须,成本低。
(2) TCC模式的作用范圍在應(yīng)用層趟脂,本質(zhì)上是實(shí)現(xiàn)針對(duì)某種業(yè)務(wù)邏輯的正向和反向方法泰讽;AT模式的作用范圍在底層數(shù)據(jù)源,通過(guò)保存操作行記錄的前后鏡像和生成反向SQL語(yǔ)句進(jìn)行補(bǔ)償操作昔期,對(duì)上層應(yīng)用透明已卸。
(3) TCC模式事務(wù)并發(fā)控制需要自行實(shí)現(xiàn)加鎖,AT模式由Seata框架自動(dòng)加鎖硼一。
舉例:
以扣錢(qián)的場(chǎng)景為例累澡,業(yè)務(wù)上完成對(duì)賬戶(hù)扣錢(qián)這一個(gè)分支事務(wù)操作,只需要一條更新賬戶(hù)余額的SQL語(yǔ)句就能完成般贼;但是如果接入TCC愧哟,用戶(hù)需要考慮如何將一步拆成兩階段,實(shí)現(xiàn)成3個(gè)方法哼蛆。
比如這樣蕊梧,扣錢(qián)場(chǎng)景中,try方法要做的是檢查賬戶(hù)余額是否充足腮介,預(yù)留轉(zhuǎn)賬資金(即凍結(jié))肥矢。在try方法執(zhí)行后,賬戶(hù)余額沒(méi)有改變叠洗,但是其中一部分被凍結(jié)了甘改,不能被其他事務(wù)使用。
二階段confirm方法執(zhí)行真正的扣錢(qián)操作灭抑,即扣掉try方法凍結(jié)的部分十艾。
如果二階段是回滾,則需要在cancel方法中釋放一階段try方法凍結(jié)的部分名挥,使賬戶(hù)回到初始狀態(tài)疟羹。
雖然相比AT模式主守,TCC模式對(duì)業(yè)務(wù)代碼侵入性太強(qiáng)。但是TCC沒(méi)有AT模式的全局行鎖榄融,加鎖邏輯需要根據(jù)業(yè)務(wù)自行實(shí)現(xiàn)参淫。因此TCC的性能會(huì)比AT模式更好,但如果用戶(hù)在tCC中自行實(shí)現(xiàn)了加鎖機(jī)制愧杯,這個(gè)優(yōu)勢(shì)就沒(méi)有了涎才。因此建議使用AT模式作為默認(rèn)方案,TCC模式作為特殊處理的補(bǔ)充方案力九。
2.2.3 Saga模式
Saga理論來(lái)自Hector和Kenneth 1987年發(fā)表的論文SAGAS耍铜。
Saga是一種補(bǔ)償協(xié)議,分布式事務(wù)內(nèi)有多個(gè)參與者跌前,每個(gè)參與者都要根據(jù)業(yè)務(wù)場(chǎng)景實(shí)現(xiàn)正向操作和逆向回滾操作棕兼。
在分布式事務(wù)執(zhí)行過(guò)程中,會(huì)依次執(zhí)行個(gè)參與者的正向操作抵乓。
- 如果所有正向操作均成功伴挚,則分布式事務(wù)提交。
- 如果任何一個(gè)正向操作執(zhí)行失敗灾炭,則分布式事務(wù)會(huì)退回去執(zhí)行前面各參與者的逆向回滾操作茎芋,回滾已提交的參與者,使分布式事務(wù)回到初始狀態(tài)蜈出。
Saga模式的正向服務(wù)和補(bǔ)償服務(wù)都需要手動(dòng)實(shí)現(xiàn)田弥,因此有很強(qiáng)的侵入性。在Saga模式中铡原,分布式事務(wù)通常是有事件驅(qū)動(dòng)的偷厦,在各個(gè)參與者之間是異步執(zhí)行的。
Saga模式是一種長(zhǎng)事務(wù)解決方案眷蜈,是用于業(yè)務(wù)流程長(zhǎng)且需要保證事務(wù)最終一致性的業(yè)務(wù)系統(tǒng)沪哺。Saga模式的一階段就會(huì)提交本地事務(wù),在無(wú)鎖酌儒、長(zhǎng)流程下可以保證性能辜妓。
Saga的優(yōu)勢(shì):
- 在一階段提交本地事務(wù),無(wú)鎖忌怎,高性能籍滴。
- 參與者可以采用事件驅(qū)動(dòng)異步執(zhí)行,高吞吐榴啸。
- 補(bǔ)償服務(wù)即正向服務(wù)的反向操作孽惰,易于理解和實(shí)現(xiàn)。
Saga模式也存在明顯的缺點(diǎn):在一階段已經(jīng)提交了本地事務(wù)鸥印,且沒(méi)有進(jìn)行預(yù)留動(dòng)作勋功,所以不能保證隔離性坦报,不容易進(jìn)行并發(fā)控制。與AT狂鞋、TCC相比片择,適用場(chǎng)景有限。
2.2.4 XA模式
在XA模式中骚揍,需要在Seata定義的分布式范圍內(nèi)字管,利用事務(wù)資源(數(shù)據(jù)庫(kù)、消息服務(wù)等)實(shí)現(xiàn)對(duì)XA協(xié)議的支持信不,以XA協(xié)議的戒指來(lái)管理分支事務(wù)嘲叔。
本質(zhì)上,Seata另外3中模式(AT抽活、TCC硫戈、Saga)都是補(bǔ)償型的。事務(wù)處理機(jī)制構(gòu)建在框架或應(yīng)用中下硕,事務(wù)資源(數(shù)據(jù)庫(kù))本身對(duì)分布式事務(wù)是無(wú)感知的掏愁。而在XA模式下,事務(wù)資源對(duì)分布式事務(wù)是感知的卵牍。
XA協(xié)議要求事務(wù)資源本身提供對(duì)規(guī)范和協(xié)議的支持。因?yàn)槭聞?wù)資源可感知并參與分布式事務(wù)處理過(guò)程沦泌,所以事務(wù)資源可以保障從任何視角對(duì)數(shù)據(jù)訪問(wèn)進(jìn)行有效隔離糊昙,滿足全局?jǐn)?shù)據(jù)一致性。
XA模式是傳統(tǒng)分布式強(qiáng)一致性的解決方案谢谦,性能較低释牺,在實(shí)際業(yè)務(wù)中使用較少。