Seata是一款開源的分布式事務(wù)解決方案,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。Seata將為用戶提供了AT、TCC、SAGA和XA事務(wù)模式,為用戶打造一站式的分布式解決方案。
AT模式
??實(shí)現(xiàn)原理
阿里SEATA獨(dú)有模式,通過(guò)生成反向SQL實(shí)現(xiàn)數(shù)據(jù)回滾,需要在數(shù)據(jù)庫(kù)額外附加UNDO_LOG表,UNDO_LOG表中保存的是自動(dòng)生成的回滾SQL。
舉個(gè)??
insert into 訂單 values(1001,...)
update 倉(cāng)儲(chǔ) set num = 300 where gid =100;
自動(dòng)生成UNDO_LOG回滾日志
DELETE FROM 訂單 where id =1001
update 倉(cāng)儲(chǔ) set num=210 where gid = 100
特點(diǎn)
性能:高
模式:AP,存在數(shù)據(jù)不一致的中間狀態(tài)
難易程度:簡(jiǎn)單,靠SEATA自己解析反向SQL并聞滾
使用要求:
所有服務(wù)與數(shù)據(jù)庫(kù)必須要自己擁有管理權(quán),因?yàn)橐獎(jiǎng)?chuàng)建UNDO LOG表
最好都是MySQL,聽說(shuō)也支持PSQL,不過(guò)沒(méi)試驗(yàn)過(guò)
應(yīng)用場(chǎng)景:
高并發(fā)互聯(lián)網(wǎng)應(yīng)用,允許數(shù)據(jù)出現(xiàn)短時(shí)不一致,可通過(guò)對(duì)賬程序或補(bǔ)錄來(lái)保證最終一致性。
TCC模式
??實(shí)現(xiàn)原理
TCC是Try-嘗試、Confirm-確認(rèn)、Cancel-取消Try嘗試階段,對(duì)資源進(jìn)行鎖定。
Confirm確認(rèn)階段,對(duì)資源進(jìn)行確認(rèn),完成操作Cancel取消階段,對(duì)資源進(jìn)行還原,取消操作。
在代碼與數(shù)據(jù)表中擴(kuò)展字段,實(shí)現(xiàn)對(duì)特定數(shù)據(jù)資源的鎖定。
Try階段:預(yù)留所需的資源,預(yù)增金額,凍結(jié)庫(kù)存
Confirm確認(rèn)階段:把預(yù)留的資源放入真實(shí)資源字段,清空預(yù)留資源
cancel階段:對(duì)鎖定的資源釋放
特點(diǎn)
性能:好
模式:AP,存在數(shù)據(jù)不一致的中間狀態(tài)
難易程度:復(fù)雜,SEATA TC只負(fù)責(zé)全局事務(wù)的提交與回滾指令,具體的回滾處理全靠程序員自己實(shí)現(xiàn)(每個(gè)業(yè)務(wù)流程車都需手動(dòng)寫代碼TRY,COMMIT,CANCEL三個(gè)對(duì)應(yīng)的方法)
使用要求:
所有服務(wù)與數(shù)據(jù)庫(kù)必須要自己擁有管理權(quán)
支持異構(gòu)數(shù)據(jù)庫(kù),可以使用不同選型實(shí)現(xiàn)
應(yīng)用場(chǎng)景:
高并發(fā)互聯(lián)網(wǎng)應(yīng)用,允許數(shù)據(jù)出現(xiàn)短時(shí)不一致,可通過(guò)對(duì)賬程序或補(bǔ)錄來(lái)保證最終一致性。
SAGA模式
??實(shí)現(xiàn)原理
Saga模式是SEATA提供的長(zhǎng)事務(wù)解決方案,在Saga模式中,業(yè)務(wù)流程中每個(gè)參與者都提交本地事務(wù),當(dāng)出現(xiàn)某一個(gè)參與者失敗則補(bǔ)償前面已經(jīng)成功的參與者,一階段正向服務(wù)和二階段補(bǔ)償服務(wù)都由業(yè)務(wù)具體實(shí)現(xiàn)者開發(fā)實(shí)現(xiàn)。
Saga相關(guān)概念
1987年普林斯頓大學(xué)的Hector Garcia-Molina和Kenneth Salem發(fā)表了一篇Paper Sagas,講述的是如何處理long lived transaction(長(zhǎng)活事務(wù))。Saga是一個(gè)長(zhǎng)活事務(wù)可被分解成可以交錯(cuò)運(yùn)行的子事務(wù)集合。其中每個(gè)子事務(wù)都是一個(gè)保持?jǐn)?shù)據(jù)庫(kù)一致性的真實(shí)事務(wù)。 論文地址:sagas
Saga的組成
每個(gè)Saga由一系列sub-transaction Ti 組成
每個(gè)Ti 都有對(duì)應(yīng)的補(bǔ)償動(dòng)作Ci,補(bǔ)償動(dòng)作用于撤銷Ti造成的結(jié)果
可以看到,和TCC相比,Saga沒(méi)有“預(yù)留”動(dòng)作,它的Ti就是直接提交到庫(kù)。
Saga的執(zhí)行順序有兩種:
T1, T2, T3, …, Tn
T1, T2, …, Tj, Cj,…, C2, C1,其中0 < j < n
Saga定義了兩種恢復(fù)策略:
-
backward recovery,向后恢復(fù),補(bǔ)償所有已完成的事務(wù),如果任一子事務(wù)失敗。即上面提到的第二種執(zhí)行順序,其中j是發(fā)生錯(cuò)誤的sub-transaction,這種做法的效果是撤銷掉之前所有成功的sub-transation,使得整個(gè)Saga的執(zhí)行結(jié)果撤銷。
-
forward recovery,向前恢復(fù),重試失敗的事務(wù),假設(shè)每個(gè)子事務(wù)最終都會(huì)成功。適用于必須要成功的場(chǎng)景,執(zhí)行順序是類似于這樣的:T1, T2, …, Tj(失敗), Tj(重試),…, Tn,其中j是發(fā)生錯(cuò)誤的sub-transaction。該情況下不需要Ci。
顯然,向前恢復(fù)沒(méi)有必要提供補(bǔ)償事務(wù),如果你的業(yè)務(wù)中,子事務(wù)(最終)總會(huì)成功,或補(bǔ)償事務(wù)難以定義或不可能,向前恢復(fù)更符合你的需求。
理論上補(bǔ)償事務(wù)永不失敗,然而,在分布式世界中,服務(wù)器可能會(huì)宕機(jī),網(wǎng)絡(luò)可能會(huì)失敗,甚至數(shù)據(jù)中心也可能會(huì)停電。在這種情況下我們能做些什么? 最后的手段是提供回退措施,比如人工干預(yù)。
這里比如支付寶只提供了轉(zhuǎn)賬接口和退款接口,而你具體負(fù)責(zé)商城訂單業(yè)務(wù),正向流程下單-支付成功-扣減庫(kù)存-訂單狀態(tài)變更為待發(fā)貨。
如果扣減庫(kù)存失敗,比如庫(kù)存為0扣減失敗了,這時(shí)候你需要自行調(diào)用支付寶的退款接口,模擬事務(wù)回滾的業(yè)務(wù)流程,支付寶是不會(huì)幫你實(shí)現(xiàn)事務(wù)回滾的。
特點(diǎn)
性能:不一定,取決于三方服務(wù),不推薦此種分布式事務(wù)
模式:AP,存在數(shù)據(jù)不一致的中間狀態(tài)
難易程度:1.復(fù)雜,提交與回滾流程全靠程序員編排,代碼邏輯難以理解,后期更是難以維護(hù)和升級(jí)。2.可能會(huì)出現(xiàn)循環(huán)依賴的死循環(huán)。3.兩種恢復(fù)策略需要保證原子性
使用要求:
在當(dāng)前架構(gòu)引入狀態(tài)機(jī)機(jī)制,類似于工作流
引入原子性,確保forward和backward時(shí)重復(fù)執(zhí)行
無(wú)法保證隔離性
應(yīng)用場(chǎng)景:
基本不推薦此種分布式事務(wù)。需要與第三方交互時(shí)才會(huì)考慮,例如:調(diào)用支付寶支付接口->出庫(kù)失敗->調(diào)用支付寶退款接口
和TCC對(duì)比
Saga相比TCC的缺點(diǎn)是缺少預(yù)留動(dòng)作,導(dǎo)致補(bǔ)償動(dòng)作的實(shí)現(xiàn)比較麻煩:Ti就是commit,比如一個(gè)業(yè)務(wù)是發(fā)送郵件,在TCC模式下,先保存草稿(Try)再發(fā)送(Confirm),撤銷的話直接刪除草稿(Cancel)就行了。而Saga則就直接發(fā)送郵件了(Ti),如果要撤銷則得再發(fā)送一份郵件說(shuō)明撤銷(Ci),實(shí)現(xiàn)起來(lái)有一些麻煩。
XA模式
??實(shí)現(xiàn)原理
基于數(shù)據(jù)庫(kù)的XA協(xié)議來(lái)實(shí)現(xiàn)2PC又稱為XA方案,數(shù)據(jù)庫(kù)必須實(shí)現(xiàn)并支持XA協(xié)議
特點(diǎn)
性能:低
模式:CP,強(qiáng)一致性
難易程度:簡(jiǎn)單,基于數(shù)據(jù)庫(kù)自帶特性實(shí)現(xiàn),無(wú)需改表
使用要求:
使用支持XA方案的關(guān)系型數(shù)據(jù)庫(kù)(主流都支持)
應(yīng)用場(chǎng)景:
金融行業(yè),并發(fā)量不大,但數(shù)據(jù)很重要的項(xiàng)目
總結(jié):
可以看出,所有分布式方式都是兩階段模式,成功提交,失敗回滾。而根據(jù)實(shí)現(xiàn)難度,TCC和SAGA都需要手動(dòng)實(shí)現(xiàn)業(yè)務(wù)回滾代碼,復(fù)雜度要高一些。其他都可以有數(shù)據(jù)庫(kù)或者第三方事務(wù)管理器實(shí)現(xiàn)回滾業(yè)務(wù)流程,而你只需要專注業(yè)務(wù)流程本身。
AT模式需要所有參與方都有數(shù)據(jù)庫(kù)權(quán)限,這點(diǎn)如果項(xiàng)目參與方都是一起的不涉及第三方或許可以實(shí)現(xiàn)。但如果你調(diào)用的是第三方服務(wù),顯然不可能支持,第三方更不可能給你提供數(shù)據(jù)庫(kù)訪問(wèn)權(quán)限,比如支付服務(wù),任何第三方支付都不可能提供數(shù)據(jù)庫(kù)權(quán)限給你。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-467684.html
因此要綜合考慮自己的使用情況,再?zèng)Q定使用哪種模式。
但是現(xiàn)實(shí)中,分布式事務(wù)還是要根據(jù)情況去使用,絕大多數(shù)項(xiàng)目能不是使用分布式事務(wù)就不會(huì)使用。只要確保最終事務(wù)一致性即可。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-467684.html
到了這里,關(guān)于Seata分布式事務(wù)AT、TCC、SAGA、XA模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!