分布式事务是啥?常用的解决方案有哪些?
所謂事務就是為了保證數據的完整性和一致性,事務管理是應用開發中必不可少的技術。要明確一點的是在傳統單體項目中我們操作的事務都是本地事務。所謂本地事務,是指該事務僅在當前工程內有效。
總的來說事務是邏輯上一組操作,組成這組操作的各個邏輯單元,要么一起成功,要么一起失敗。
?
關于事務的隔離級別(讀未提交、讀已提交、可重復讀)和傳播行為(REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW….)此處不做過多的描述。?
?
分布式事務:
傳統的一個工程內為了保證數據的一致性,使用本地事務。本地事務只能解決同一工程中的事務問題,而現在的場景更加復雜,關系到兩個甚至多個工程模塊,怎么保證要么都成功,要么都失敗?
分布式事務指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位于不同的分布式系統的不同節點之上。
簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的服務器上,且屬于不同的應用,分布式事務需要保證這些小操作要么全部成功,要么全部失敗。
?
分布式事務場景
?
1.?不同微服務之間會有分布式事務問題??
2.?同一工程不同數據庫? ? ? ? ? ??
3. 不同微服務不同數據庫
?
遠程調用:網絡超時?遠程服務器宕機
?
分布式事務解決方案
?
分布式事務是企業集成中的一個技術難點,也是每一個分布式系統架構中都會涉及到的一個東西,特別是在微服務架構中,幾乎可以說是無法避免。
主流的解決方案如下:
1.?TCC編程模式
2.?消息事務+最終一致性
?
1.TCC補償式事務
是一種編程式分布式事務解決方案。
TCC 其實就是采用的補償機制,其核心思想是:針對每個操作,都要注冊一個與其對應的確認和補償(撤銷)操作。TCC模式要求從服務提供三個接口:Try、Confirm、Cancel。
1.Try:主要是對業務系統做檢測及資源預留
?
2.Confirm:真正執行業務,不作任何業務檢查;只使用Try階段預留的業務資源;Confirm操作滿足冪等性
?
3.Cancel:釋放Try階段預留的業務資源;Cancel操作滿足冪等性
?
整個TCC業務分成兩個階段完成:
?
第一階段:主業務服務分別調用所有從業務的try操作,并在活動管理器中登記所有從業務服務。當所有從業務服務的try操作都調用成功或者某個從業務服務的try操作失敗,進入第二階段。
第二階段:活動管理器根據第一階段的執行結果來執行confirm或cancel操作。如果第一階段所有try操作都成功,則活動管理器調用所有從業務活動的confirm操作。否則調用所有從業務服務的cancel操作。
舉個例子,假如 Bob 要向 Smith 轉賬100元,思路大概是:
我們有一個本地方法,里面依次調用
1.?首先在 Try 階段,要先檢查Bob的錢是否充足,并把這100元鎖住,Smith賬戶也凍結起來
?
2.?在 Confirm 階段,執行遠程調用的轉賬的操作,轉賬成功進行解凍
?
3.?如果第2步執行成功,那么轉賬成功,如果第二步執行失敗,則調用遠程凍結接口對應的解凍方法 (Cancel)
缺點:
1.?Canfirm和Cancel的冪等性很難保證
?
2.?這種方式缺點比較多,通常在復雜場景下是不推薦使用的,除非是非常簡單的場景,非常容易提供回滾Cancel,而且依賴的服務也非常少的情況
?
3.這種實現方式會造成代碼量龐大,耦合性高。而且非常有局限性,因為有很多的業務是無法很簡單的實現回滾的,如果串行的服務很多,回滾的成本實在太高
不少大公司里,其實都是自己研發 TCC 分布式事務框架的,專門在公司內部使用。國內開源出去的:ByteTCC,TCC-transaction,Himly。
?
2.消息事務+最終一致性
基于消息中間件的兩階段提交往往用在高并發場景下,將一個分布式事務拆成一個消息事務(A系統的本地操作+發消息)+B系統的本地操作,其中B系統的操作由消息驅動,只要消息事務成功,那么A操作一定成功,消息也一定發出來了,這時候B會收到消息去執行本地操作,如果本地操作失敗,消息會重投,直到B操作成功,這樣就變相地實現了A與B的分布式事務。
雖然上面的方案能夠完成A和B的操作,但是A和B并不是嚴格一致的,而是最終一致的,我們在這里犧牲了一致性,換來了性能的大幅度提升。當然,這種玩法也是有風險的,如果B一直執行不成功,那么一致性會被破壞,具體要不要玩,還是得看業務能夠承擔多少風險。適用于高并發最終一致。
?
關注微信公眾號“蝦米聊吧”,獲取更多技術知識干貨喲~
總結
以上是生活随笔為你收集整理的分布式事务是啥?常用的解决方案有哪些?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么设置Win10任务栏通知区域 设置W
- 下一篇: activemq 延时队列以及不生效问题