分布式事務指事務的操作位於不同的節點上,需要保證事務的 aicd 特性。
例如在下單場景下,庫存和訂單如果不在同乙個節點上,就涉及分布式事務。
在分布式系統中,要實現分布式事務,無外乎那幾種解決方案。
兩階段提交(two-phase commit,2pc),通過引入協調者(coordinator)來協調參與者的行為,並最終決定這些參與者是否要真正執行事務。
1.1 準備階段
協調者詢問參與者事務是否執行成功,參與者發回事務執行結果。
1.2 提交階段
如果事務在每個參與者上都執行成功,事務協調者傳送通知讓參與者提交事務;否則,協調者傳送通知讓參與者回滾事務。
需要注意的是,在準備階段,參與者執行了事務,但是還未提交。只有在提交階段接收到協調者發來的通知後,才進行提交或者回滾。
2.1 同步阻塞所有事務參與者在等待其它參與者響應的時候都處於同步阻塞狀態,無法進行其它操作。
2.2 單點問題協調者在 2pc 中起到非常大的作用,發生故障將會造成很大影響。特別是在階段二發生故障,所有參與者會一直等待狀態,無法完成其它操作。
2.3 資料不一致在階段二,如果協調者只傳送了部分 commit 訊息,此時網路發生異常,那麼只有部分參與者接收到 commit 訊息,也就是說只有部分參與者提交了事務,使得系統資料不一致。
2.4 太過保守任意乙個節點失敗就會導致整個事務失敗,沒有完善的容錯機制。
tcc 其實就是採用的補償機制,其核心思想是:針對每個操作,都要註冊乙個與其對應的確認和補償(撤銷)操作。它分為三個階段:
舉個例子,假入 bob 要向 smith 轉賬,思路大概是: 我們有乙個本地方法,裡面依次呼叫
首先在 try 階段,要先呼叫遠端介面把 smith 和 bob 的錢給凍結起來。
在 confirm 階段,執行遠端呼叫的轉賬的操作,轉賬成功進行解凍。
如果第2步執行成功,那麼轉賬成功,如果第二步執行失敗,則呼叫遠端凍結介面對應的解凍方法 (cancel)。
優點:跟2pc比起來,實現以及流程相對簡單了一些,但資料的一致性比2pc也要差一些
缺點:缺點還是比較明顯的,在2,3步中都有可能失敗。tcc屬於應用層的一種補償方式,所以需要程式設計師在實現的時候多寫很多補償的**,在一些場景中,一些業務流程可能用tcc不太好定義及處理。
本地訊息表與業務資料表處於同乙個資料庫中,這樣就能利用本地事務來保證在對這兩個表的操作滿足事務特性,並且使用了訊息佇列來保證最終一致性。
在分布式事務操作的一方完成寫業務資料的操作之後向本地訊息表傳送乙個訊息,本地事務能保證這個訊息一定會被寫入本地訊息表中。
之後將本地訊息表中的訊息**到 kafka 等訊息佇列中,如果**成功則將訊息從本地訊息表中刪除,否則繼續重新**。
在分布式事務操作的另一方從訊息佇列中讀取乙個訊息,並執行訊息中的操作。
優點:一種非常經典的實現,避免了分布式事務,實現了最終一致性。
缺點:訊息表會耦合到業務系統中,如果沒有封裝好的解決方案,會有很多雜活需要處理。
有一些第三方的mq是支援事務訊息的,比如rocketmq,他們支援事務訊息的方式也是類似於採用的二階段提交,但是市面上一些主流的mq都是不支援事務訊息的,比如 rabbitmq 和 kafka 都不支援。
以阿里的 rocketmq 中介軟體為例,其思路大致為:
第一階段prepared訊息,會拿到訊息的位址。 第二階段執行本地事務,第三階段通過第一階段拿到的位址去訪問訊息,並修改狀態。
也就是說在業務方法內要想訊息佇列提交兩次請求,一次傳送訊息和一次確認訊息。如果確認訊息傳送失敗了rocketmq會定期掃瞄訊息集群中的事務訊息,這時候發現了prepared訊息,它會向訊息傳送者確認,所以生產方需要實現乙個check介面,rocketmq會根據傳送端設定的策略來決定是回滾還是繼續傳送確認訊息。這樣就保證了訊息傳送與本地事務同時成功或同時失敗。
優點:實現了最終一致性,不需要依賴本地資料庫事務。
缺點:實現難度大,主流mq不支援,rocketmq事務訊息部分**也未開源。
通過本文我們總結並對比了幾種分布式分解方案的優缺點,分布式事務本身是乙個技術難題,是沒有一種完美的方案應對所有場景的,具體還是要根據業務場景去抉擇吧。筆者上家公司是試用阿里rocketmq去實現的分布式事務,現在也有除了很多分布式事務的協調器,比如lcn等,大家可以多去嘗試。
**:
分布式事務四種解決方案
分布式事務指事務的操作位於不同的節點上,需要保證事務的 aicd 特性 事務特性見事務特性及隔離級別 例如在下單場景下,庫存和訂單如果不在同乙個節點上,就涉及分布式事務。兩階段提交 two phase commit,2pc 通過引入協調者來協調參與者的行為,並最終決定這些參與者是否要真正執行事務。兩...
分布式事務的四種解決方案
分布式事務指事務的操作位於不同的節點上,需要保證事務的 aicd 特性。例如在下單場景下,庫存和訂單如果不在同乙個節點上,就涉及分布式事務。在分布式系統中,要實現分布式事務,無外乎那幾種解決方案。兩階段提交 two phase commit,2pc 通過引入協調者 coordinator 來協調參與...
分布式事務的四種解決方案
簡述 分布式事務指事務的操作位於不同的節點上,需要保證事務的 aicd 特性。例如在下單場景下,庫存和訂單如果不在同乙個節點上,就涉及分布式事務。解決方案 在分布式系統中,要實現分布式事務,無外乎那幾種解決方案。一 兩階段提交 2pc 兩階段提交 two phase commit,2pc 通過引入協...