分散式事務的實現方式
TCC
參與角色
業務活動管理器(協調者)、業務服務
TCC解釋
Try階段:嘗試執行,完成所有業務檢查(一致性),預留必須業務資源(準隔離性)
Confirm階段:確認執行真正執行業務,不作任何業務檢查,只使用Try階段預留的業務資源,Confirm操作滿足冪等性。要求具備冪等設計,Confirm失敗後需要進行重試。
Cancel階段:取消執行,釋放Try階段預留的業務資源 Cancel操作滿足冪等性Cancel階段的異常和Confirm階段異常處理方案基本上一致。
實現
PS:所有業務需要實現TCC介面;通過補償可以實現最終一致性。
例項
舉個簡單的例子如果你用100元買了一瓶水, Try階段:你需要向你的錢包檢查是否夠100元並鎖住這100元,水也是一樣的。如果有一個失敗,則進行cancel(釋放這100元和這一瓶水),如果cancel失敗不論什麼失敗都進行重試cancel,所以需要保持冪等。如果都成功,則進行confirm,確認這100元扣,和這一瓶水被賣,如果confirm失敗無論什麼失敗則重試(會依靠活動日誌進行重試)
資料庫分散式事務中的 XA Transactions
角色
事務管理器(協調者)、業務服務
實現
第一階段:事務管理器要求每個涉及到事務的資料庫預提交(precommit)此操作,並反映是否可以提交.
第二階段:事務協調器要求每個資料庫提交資料,或者回滾資料。
PS: XA協議基於2pc協議實現。
MQ
角色
訊息中介軟體、業務服務
實現
第一階段Prepared訊息,會拿到訊息的地址。
執行本地事務。
第二階段確認訊息傳送,如果確認訊息失敗,在RocketMq Broker中提供了定時掃描沒有更新狀態的訊息,如果有訊息沒有得到確認,會向訊息傳送者傳送訊息,來判斷是否提交
第三階段中介軟體傳送訊息給其它業務服務。如果 傳送超時,則需要一直髮送。
第四階段其它業務服務處理完成之後,需要通過中介軟體反饋給發起者。如果處理失敗,則需要人工處理(由人工決定是否回滾或者繼續)。
SAGA
角色
協調器、業務服務
實現
由Saga事務協調器協調,如果正常結束那就正常完成,如果某個步驟失敗,則根據相反順序一次呼叫補償操作