Seata讀書(shū)筆記2-Seata簡(jiǎn)介

學(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ù)中使用較少。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末回挽,一起剝皮案震驚了整個(gè)濱河市没咙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌千劈,老刑警劉巖祭刚,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異墙牌,居然都是意外死亡涡驮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)喜滨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捉捅,“玉大人,你說(shuō)我怎么就攤上這事虽风“艨冢” “怎么了寄月?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)无牵。 經(jīng)常有香客問(wèn)我漾肮,道長(zhǎng),這世上最難降的妖魔是什么合敦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任初橘,我火速辦了婚禮,結(jié)果婚禮上充岛,老公的妹妹穿的比我還像新娘保檐。我一直安慰自己,他們只是感情好崔梗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布夜只。 她就那樣靜靜地躺著,像睡著了一般蒜魄。 火紅的嫁衣襯著肌膚如雪扔亥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天谈为,我揣著相機(jī)與錄音旅挤,去河邊找鬼。 笑死伞鲫,一個(gè)胖子當(dāng)著我的面吹牛粘茄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秕脓,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柒瓣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吠架?” 一聲冷哼從身側(cè)響起芙贫,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傍药,沒(méi)想到半個(gè)月后磺平,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怔檩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年褪秀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薛训。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡媒吗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乙埃,到底是詐尸還是另有隱情闸英,我是刑警寧澤锯岖,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甫何,受9級(jí)特大地震影響出吹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辙喂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一捶牢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巍耗,春花似錦秋麸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至亲族,卻和暖如春炒考,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霎迫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工斋枢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人知给。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓杏慰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親炼鞠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容