06、分布式事務(wù)-初探Seata中多事務(wù)模式的差異-上

章節(jié)歸屬

分布式事務(wù)系列

概述

Seata的核心價值在于 構(gòu)建一個全面解決分布式事務(wù)問題的標(biāo)準(zhǔn)化平臺

當(dāng)前技術(shù)背景下,不存在一個分布式事務(wù)處理機制可以完美滿足所有場景的需求,系統(tǒng)存在一致性、可靠性、易用性、性能等諸多方面的約束,需要不同的事務(wù)處理機制去滿足。
基于Seata,上層應(yīng)用架構(gòu)可以根據(jù)實際場景的需求,靈活選擇合適的分布式事務(wù)解決方案。

1.TCC模式(2PC、補償型)

據(jù)說螞蟻早期大量采用的分布式事務(wù)方案就是TCC模式,屬于萬金油了。

1.1 優(yōu)點
資源鎖定時間短

使用TCC模式時,在try階段就提交了本地事務(wù),并不會鎖定資源,所以沒有其他額外的性能開銷

并發(fā)度高

可由其他方式鎖定資源,而不必對數(shù)據(jù)加全局鎖,允許多個事務(wù)同時操作數(shù)據(jù)。

應(yīng)對場景多
  • 可在非JDBC方式通信的DB(如Elasticsearch 、Redis)場景使用。
  • 可在非DB場景(如三方rest接口)場景使用。
1.2 缺點
業(yè)務(wù)侵入嚴重

服務(wù)提供方必須已手動方式 將業(yè)務(wù)邏輯拆分成2階段,實現(xiàn)try、confirm和cancel 3個方法,遵守分布式事務(wù)所約束的額外的規(guī)則。

開發(fā)維護成本高

try、confirm和cancel 3個固定邏輯,無法通過事務(wù)框架自動生成,設(shè)計、開發(fā)成本高,后續(xù)維護改造的成本也高。

2.AT模式(2PC、補償型)

Seata中默認推薦的模式,官宣能應(yīng)對當(dāng)下80%的分布式場景。

2.1.優(yōu)點:

業(yè)務(wù)無侵入

對業(yè)務(wù)無入侵,開發(fā)者只需正向關(guān)注自己的業(yè)務(wù)邏輯sql(與TCC模式比較,不需要將業(yè)務(wù)拆分并提供try、confirm、cancel方法),快速集成后即使用。

性能尚可

AT解析,一階段提前釋放本地鎖,二階段決議提交時釋放全局鎖,無需將數(shù)據(jù)鎖定持續(xù)到二階段結(jié)束,這里就已經(jīng)相對傳統(tǒng)二階段事務(wù)尤其是XA提升了,TCC 、XA 都需要二階段驅(qū)動,而AT模式在二階段決議提交時分布式事務(wù)就已經(jīng)完成了,無需再次驅(qū)動rm進行二階段動作。

一階段多了幾次DB讀寫操作,有一定的性能損耗。

2.2.缺點:

存在中間狀態(tài)

補償型事務(wù)處理機制構(gòu)建在事務(wù)資源之上(在中間件或者應(yīng)用層,而不是DB層),事務(wù)資源本身對分布式事務(wù)無感知,這就導(dǎo)致無法做到全方位隔離,即中間狀態(tài)可見。在Seata中,要通過應(yīng)用層的鎖機制來達到讀已提交的隔離效果。

依賴全局行鎖

AT需要全局行鎖來保證隔離性,所以無論是單庫的操作還是1-n個服務(wù)都需要開啟全局事務(wù)來保證隔離性。

有一定的適配成本

支持mysql,pgsql,oracle等數(shù)據(jù)庫,需要應(yīng)用層做適配,對復(fù)雜sql的解析成本更大,開發(fā)效率低,支持的sql數(shù)量少;跨語言的需要在應(yīng)用層額外的開發(fā)支持。但一旦是社區(qū)已經(jīng)提供好的則無需考慮這些問題。

3.Seata XA模式(2PC、強一致)

DTP定義TM和RM之間采用XA接口通訊協(xié)議,XA模式就是基于數(shù)據(jù)庫的XA協(xié)議來實現(xiàn)的兩階段提交方案。

3.1.優(yōu)點:

全局一致性

AT模式下數(shù)據(jù)的讀已提交需由額外的應(yīng)用層的全局行鎖機制來保障;而 XA模式下,隔離性由數(shù)據(jù)庫自身保障,資源和全局事務(wù)渾然一體,做到全局一致性

侵入性略低

少于2個服務(wù)的操作,XA僅使用本地事務(wù)即可滿足一致性,不再需要TC的參與。

兼容性好
  • XA協(xié)議被主流的db(mysql,pgsql,oracle)支持,沒有sql語法的限制,而AT需要由應(yīng)用層額外的代碼來解析并適配sql.
  • XA是協(xié)議層的,多語言支持度高。

3.2.缺點:

鎖粒度大

XA本地數(shù)據(jù)庫可能持有間隙鎖,造成鎖的粒度更大,鎖定更多無辜數(shù)據(jù)

死鎖(協(xié)議阻塞)

準(zhǔn)備階段后,各分支事務(wù)進入阻塞階段,收到 提交\回滾的指令之前必須阻塞等待。而這期間如果有什么異常導(dǎo)致TM無法下達提交\回滾的指令,那么這個沒有提交的xa事務(wù)將會一直 持有鎖,造成死鎖的局面。

性能較差

據(jù)說使用XA分布式事務(wù)跟沒有事務(wù)的情況下有10倍的性能差異,主要原因就是上面的阻塞跟數(shù)據(jù)鎖定造成,因為xa的一階段并非提交,帶來以下2個問題:

  • 事務(wù)協(xié)調(diào)過程,增加單個事務(wù)的 RT;
  • 并發(fā)事務(wù)數(shù)據(jù)的鎖沖突,降低吞吐。
應(yīng)用場景受限
  • 適用于單體應(yīng)用多數(shù)據(jù)源的情況(早期大型機上的金融類單體應(yīng)用用的多)
  • 不適用于分布式場景

At模式的一階段提交,AT的性能是優(yōu)于XA,因為它鎖在TC一側(cè)集中釋放,無需多個庫進行本地的鎖釋放

運維成本

在mysql數(shù)據(jù)庫中對XA支持的不太理想,mysql的XA實現(xiàn),沒有記錄prepare階段日志,主備切換回導(dǎo)致主庫與備庫數(shù)據(jù)不一致(這些是不是MySQL 5.7之前的缺陷,mysql8之后的情況怎樣呢?)運維復(fù)雜,DBA缺少這方面經(jīng)驗;

這段信息有待確認

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容