更新時間:2022-03-18 11:15:14 來源:動力節點 瀏覽1585次
TCC 模型:TCC-Transaction、Hmily
XA 模型:Sharding Sphere、MyCAT
2PC 模型:raincat、lcn
MQ 模型:RocketMQ
BED 模型:Sharding Sphere
Saga 模型:ServiceComb Saga
TCC事務解決方案本質上是一種補償的思路,它把事務運行過程分成try、confirm/cancel 兩個階段,每個階段都由業務代碼來控制。需要注意的是,TCC事務和2pc的思想類似,但與2pc實現不同,TCC不再是兩階段提交,而只是它對事務的提交/回滾是通過執行一段confirm/cancel業務邏輯來實現,并且也并沒有全局事務來把控整個事務邏輯。
實現過程:
try:完成所有業務檢查(一致性),預留業務資源。
confirm:確認執行業務操作,只使用try階段預留的業務資源。
cancel:取消try階段預留的業務資源。
xa是個規范,根據這個思想衍生二階段提交協議和三階段提交協議。
XA分布式事務是由一個或者多個Resource Managerd,一個事務管理器Transaction Manager以及一個應用程序 Application Program組成。
資源管理器:提供訪問事務資源的方法,通常一個數據庫就是一個資源管理器。
事務管理器:協調參與全局事務中的各個事務。需要和參與全局事務中的資源管理器進行通信。
應用程序:定義事務的邊界,指定全局事務中的操作。
二階段提交是分布式事務的重要的一個關鍵點,二階段提交協議包含了兩個階段:第一階段(也稱準備階段)和第二階段(也稱提交階段)。
準備階段:準備階段,每個資源管理器都會被輪訓一遍,事務管理器給每個資源管理器發送Prepare消息,每個資源管理器要么直接返回失敗(如權限驗證失敗)或異常,要么在本地執行事務等等,但不Commoit,處于Ready狀態。
提交階段:如果事務管理器收到了資源管理器的失敗信息(如異常、超時等),直接給每個資源管理器發送回滾(Rollback)消息;否則,發送提交(Commit)消息;資源管理器根據事務管理器的指令執行Commit或者Rollback操作,釋放所有事務處理過程中使用的鎖資源。(注意:必須在最后階段釋放鎖資源)
可以看出,二階段提交這么做的就是讓前面都完成了準備工作,才能提交整個事務,若中間由某一環節出現問題,則整個事務回滾。
從兩階段提交的工作方式來看,很顯然,在提交事務的過程中需要在多個節點之間進行協調,而各節點對鎖資源的釋放必須等到事務最終提交時,這樣,比起一階段提交,兩階段提交在執行同樣的事務時會消耗更多時間。事務執行時間的延長意味著鎖資源發生沖突的概率增加,當事務的并發量達到一定數量的時候,就會出現大量事務積壓甚至出現死鎖,系統性能就會嚴重下滑。
消息一致性方案是通過消息中間件保證上下游應用數據操作的一致性。基本思路是將本地操作和發送消息放在一個事務中,下游應用向消息系統訂閱該消息,收到消息后執行相應操作。本質上是依靠消息的重試機制,達到最終一致性。消息驅動的缺點是:耦合度高,需要在業務系統中引入MQ,導致系統復雜度增加。
柔性事務是對XA協議的妥協和補償,它通過對強一致性要求的降低,已達到降低數據庫資源鎖定時間的效果。柔性事務的種類很多,可以通過各種不同的策略來權衡使用。
一階段提交 + 補償 :最大努力送達(BED)
最大努力送達,是針對于弱XA的一種補償策略。它采用事務表記錄所有的事務操作SQL,如果子事務提交成功,將會刪除事務日志;如果執行失敗,則會按照配置的重試次數,嘗試再次提交,即最大努力的進行提交,盡量保證數據的一致性,這里可以根據不同的業務場景,平衡C和A,采用同步重試或異步重試。
這種策略的優點是無鎖定資源時間,性能損耗小。缺點是嘗試多次提交失敗后,無法回滾,它僅適用于事務最終一定能夠成功的業務場景。因此BED是通過事務回滾功能上的妥協,來換取性能的提升。
Saga事務模型又叫做長時間運行的事務(Long-running-transaction), 它是由普林斯頓大學的H.Garcia-Molina等人提出,它描述的是另外一種在沒有兩階段提交的的情況下解決分布式系統中復雜的業務事務問題。你可以在這里看到 Sagas 相關論文。
我們這里說的是一種基于 Sagas 機制的工作流事務模型,這個模型的相關理論目前來說還是比較新的,以至于百度上幾乎沒有什么相關資料。
該模型其核心思想就是拆分分布式系統中的長事務為多個短事務,或者叫多個本地事務,然后由 Sagas 工作流引擎負責協調,如果整個流程正常結束,那么就算是業務成功完成,如果在這過程中實現失敗,那么Sagas工作流引擎就會以相反的順序調用補償操作,重新進行業務回滾。
比如我們一次關于購買旅游套餐業務操作涉及到三個操作,他們分別是預定車輛,預定賓館,預定機票,他們分別屬于三個不同的遠程接口。可能從我們程序的角度來說他們不屬于一個事務,但是從業務角度來說是屬于同一個事務的。
他們的執行順序如上圖所示,所以當發生失敗時,會依次進行取消的補償操作。
因為長事務被拆分了很多個業務流,所以 Sagas 事務模型最重要的一個部件就是工作流或者你也可以叫流程管理器(Process Manager),工作流引擎和Process Manager雖然不是同一個東西,但是在這里,他們的職責是相同的。在選擇工作流引擎之后,最終的代碼也許看起來是這樣的。如果大家想了解更多相關知識,可以關注一下動力節點的Dubbo教程,里面的內容細致全面,通俗易懂,適合小白學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習