分布式事務的解決方案
強一緻性:
一、兩階段送出(2PC)
- 引進一個事務協調者
- 準備階段:每個節點執行自己的任務,并傳回執行結果!
- 送出階段:如果全部成功,則全部執行事務送出;否則全部執行事務復原!【如果失敗,則不斷嘗試送出或復原!】
存在的問題?
- 同步阻塞:等所有事務執行結果後才能送出或復原
- 單點問題:協調者如果中途故障,則參與者可能會一直阻塞
- 資料不一緻:協調者如果中途故障
二、三階段送出(3PC)
和2PC類似,隻是準備階段隻是詢問參與者是否可以執行事務,然後預送出階段和送出階段分别是執行、送出事務!
補償性事務
三、補償事務(TCC)
TCC 指的是
Try - Confirm - Cancel
。
- Try 指的是預留,即資源的預留和鎖定,注意是預留。
- Confirm 指的是确認操作,這一步其實就是真正的執行了。
- Cancel 指的是撤銷操作,可以了解為把預留階段的動作撤銷了。
- 先預留
- 預留成功則執行
- 預留失敗則撤銷
最終一緻性事務:
四、本地消息表
就是将事務和事務的執行結果放在自己的一張表中,背景任務定時去讀取本地消息表,篩選出還未成功的消息再調用對應的服務,服務更新成功了再變更消息的狀态。 可以容忍了資料暫時不一緻的情況,保證最終一緻性就可以!【可能需要保證幂等性】
五、MQ 事務消息
RocketMQ 就很好的支援了消息事務,讓我們來看一下如何通過消息實作事務。
第一步先給 Broker 發送事務消息即半消息,半消息不是說一半消息,而是這個消息對消費者來說不可見,然後發送成功後發送方再執行本地事務。
再根據本地事務的結果向 Broker 發送 Commit 或者 RollBack 指令。