首頁>Club>
4
回覆列表
  • 1 # 飛航動力

    我們先來了解一下概念, 再看幾種的解決方法。

    分散式事務指事務的操作位於不同的節點上,需要保證事務的 AICD 特性。

    例如在下單場景下,庫存和訂單如果不在同一個節點上,就涉及分散式事務。

    解決方案

    在分散式系統中,要實現分散式事務,無外乎那幾種解決方案。

    一、兩階段提交(2PC)

    兩階段提交(Two-phase Commit,2PC),透過引入協調者(Coordinator)來協調參與者的行為,並最終決定這些參與者是否要真正執行事務。

    執行過程

    1.1 準備階段

    協調者詢問參與者事務是否執行成功,參與者發回事務執行結果。

    1.2 提交階段

    如果事務在每個參與者上都執行成功,事務協調者傳送通知讓參與者提交事務;否則,協調者傳送通知讓參與者回滾事務。

    需要注意的是,在準備階段,參與者執行了事務,但是還未提交。只有在提交階段接收到協調者發來的通知後,才進行提交或者回滾。

    存在的問題

    2.1 同步阻塞 所有事務參與者在等待其它參與者響應的時候都處於同步阻塞狀態,無法進行其它操作。

    2.2 單點問題 協調者在 2PC 中起到非常大的作用,發生故障將會造成很大影響。特別是在階段二發生故障,所有參與者會一直等待狀態,無法完成其它操作。

    2.3 資料不一致 在階段二,如果協調者只發送了部分 Commit 訊息,此時網路發生異常,那麼只有部分參與者接收到 Commit 訊息,也就是說只有部分參與者提交了事務,使得系統資料不一致。

    2.4 太過保守 任意一個節點失敗就會導致整個事務失敗,沒有完善的容錯機制。

    二、補償事務(TCC)

    TCC 其實就是採用的補償機制,其核心思想是:針對每個操作,都要註冊一個與其對應的確認和補償(撤銷)操作。它分為三個階段:

    Try 階段主要是對業務系統做檢測及資源預留

    Confirm 階段主要是對業務系統做確認提交,Try階段執行成功並開始執行 Confirm階段時,預設 Confirm階段是不會出錯的。即:只要Try成功,Confirm一定成功。

    Cancel 階段主要是在業務執行錯誤,需要回滾的狀態下執行的業務取消,預留資源釋放。

    舉個例子,假入 Bob 要向 Smith 轉賬,思路大概是: 我們有一個本地方法,裡面依次呼叫

    首先在 Try 階段,要先呼叫遠端介面把 Smith 和 Bob 的錢給凍結起來。

    在 Confirm 階段,執行遠端呼叫的轉賬的操作,轉賬成功進行解凍。

    如果第2步執行成功,那麼轉賬成功,如果第二步執行失敗,則呼叫遠端凍結介面對應的解凍方法 (Cancel)。

    優點: 跟2PC比起來,實現以及流程相對簡單了一些,但資料的一致性比2PC也要差一些

    缺點: 缺點還是比較明顯的,在2,3步中都有可能失敗。TCC屬於應用層的一種補償方式,所以需要程式設計師在實現的時候多寫很多補償的程式碼,在一些場景中,一些業務流程可能用TCC不太好定義及處理。

    三、本地訊息表(非同步確保)

    本地訊息表與業務資料表處於同一個資料庫中,這樣就能利用本地事務來保證在對這兩個表的操作滿足事務特性,並且使用了訊息佇列來保證最終一致性。

    在分散式事務操作的一方完成寫業務資料的操作之後向本地訊息表傳送一個訊息,本地事務能保證這個訊息一定會被寫入本地訊息表中。

    在分散式事務操作的另一方從訊息佇列中讀取一個訊息,並執行訊息中的操作。

    優點: 一種非常經典的實現,避免了分散式事務,實現了最終一致性。

    缺點: 訊息表會耦合到業務系統中,如果沒有封裝好的解決方案,會有很多雜活需要處理。

    四、MQ 事務訊息

    有一些第三方的MQ是支援事務訊息的,比如RocketMQ,他們支援事務訊息的方式也是類似於採用的二階段提交,但是市面上一些主流的MQ都是不支援事務訊息的,比如 RabbitMQ 和 Kafka 都不支援。

    以阿里的 RocketMQ 中介軟體為例,其思路大致為:

    第一階段Prepared訊息,會拿到訊息的地址。 第二階段執行本地事務,第三階段透過第一階段拿到的地址去訪問訊息,並修改狀態。

    也就是說在業務方法內要想訊息佇列提交兩次請求,一次傳送訊息和一次確認訊息。如果確認訊息傳送失敗了RocketMQ會定期掃描訊息叢集中的事務訊息,這時候發現了Prepared訊息,它會向訊息傳送者確認,所以生產方需要實現一個check介面,RocketMQ會根據傳送端設定的策略來決定是回滾還是繼續傳送確認訊息。這樣就保證了訊息傳送與本地事務同時成功或同時失敗。

    優點: 實現了最終一致性,不需要依賴本地資料庫事務。

    缺點: 實現難度大,主流MQ不支援,RocketMQ事務訊息部分程式碼也未開源。

    總結

    透過本文我們總結並對比了幾種分散式分解方案的優缺點,分散式事務本身是一個技術難題,是沒有一種完美的方案應對所有場景的,具體還是要根據業務場景去抉擇吧。筆者上家公司是試用阿里RocketMQ去實現的分散式事務,現在也有除了很多分散式事務的協調器,比如LCN等,大家可以多去嘗試。

  • 2 # 阿郎電腦

    對於作為社會主義的打好男人,我你這樣做對得起社會,對得起人民嗎?我只想說4個字:請帶上我!

    對於你們幾個,我是在難以想象現在的社會風氣,滿腦子的隱晦思想,我都好難過,這社會是怎麼了。我很想拯救世界,但是在拯救世界之前我想說:算我一個

  • 3 # dongfuye

    推薦 https://github.com/yedf/dtm

    極易接入:支援HTTP,提供非常簡單的介面,極大降低上手分散式事務的難度,新手也能快速接入使用簡單:開發者不再擔心懸掛、空補償、冪等各類問題,框架層代為處理跨語言:可適合多語言棧的公司使用。方便go、python、php、nodejs、ruby、c# 各類語言使用。易部署、易擴充套件僅依賴mysql,部署簡單,易叢集化,易水平擴充套件多種分散式事務協議支援TCC、SAGA、XA、事務訊息

  • 中秋節和大豐收的關聯?
  • 想組裝一臺電腦,用迷你主機好還是用大主機好?