分布式事務 解決方案之可靠訊息最終一致性理論

2021-10-23 15:51:23 字數 2917 閱讀 6189

可靠訊息最終一致性:是指當事務發起方執行完成本地事務後發出一條訊息,事務參與方(訊息消費者)一定能夠接收訊息並處理成功,即強調的是只要訊息發給事務參與方最終事務要達到一致。

該方案通常是利用訊息中介軟體完成,如下圖:

事務發起方(訊息生產方)將訊息發給訊息中介軟體,事務參與方從訊息中介軟體接收訊息,事務發起方和訊息中介軟體

之間,事務參與方(訊息消費方)和訊息中介軟體之間都是通過網路通訊,由於網路通訊的不確定性會導致分布式事

務問題。

因此可靠訊息最終一致性方案要解決以下幾個問題:

(1)本地事務與訊息傳送的原子性問題

事務發起方在本地事務執行成功後訊息必須發出去,否則就丟棄訊息。即實現本地事務和訊息傳送的原子性,要麼都成功,要麼都失敗。本地事務與訊息傳送的原子性問題是實現可靠訊息最終一致性方案的關鍵問題。針對這點,我麼可能這樣:

先傳送訊息,再運算元據庫:

begin transaction;

// 1.傳送訊息到mq

// 2.資料業務操作

commit transation;

這種情況是無法保證資料庫操作與傳送訊息的一致性,因為可能傳送訊息成功,資料業務操作失敗。所以我們可能就有第二種方案,先進行資料庫操作,再傳送訊息:

begin transaction;

// 1.資料業務操作

// 2.傳送訊息到mq

commit transation;

這種情況看似沒有問題,理想情況下如果傳送mq訊息失敗,就會丟擲異常,導致資料庫事務回滾。但如果傳送訊息到mq超時異常,資料庫回滾,此時mq有可能已經正常傳送,那麼仍然無法做到原子性。

(2)事務參與方接收訊息的可靠性

事務參與方必須能夠從訊息中介軟體接收到訊息,並且如果接收訊息失敗可以重複接收訊息。

(3)訊息重複消費的問題

由於網路的存在,假設乙個消費節點超時但是消費成功,此時訊息中介軟體會重複投遞此訊息,那麼就會導致訊息的重複消費。要解決訊息重複消費的問題就要實現事務參與方的方法冪等性。這一點訊息中介軟體是無法保證的。

針對上面的幾個問題,解決方案主要有以下兩個:

本地訊息表是指通過本地事務保證資料業務操作和訊息的一致性,其操作大致如下:

begin transaction;

// 1.執行資料業務操作

// 2.新增訊息記錄

commit transation;

然後通過定時任務將訊息傳送至訊息中介軟體(解決問題1:本地事務與訊息傳送的原子性問題),待訊息確認傳送給消費方成功後再將訊息刪除(解決問題2:事務參與方接收訊息的可靠性)。

需要注意的是:

只有當消費方消費成功後,向mq傳送ack(即訊息確認),此時說明消費者正常消費訊息完成,mq將不再向消費者推送訊息,否則消費者會不斷重試向消費者來傳送訊息。

rocketmq事務訊息主要是為了解決生成者的訊息傳送與本地事務執行的原子性問題,rocketmq 的 broker 與 producer 端的雙向通訊能力,使得 broker 天生可以作為乙個事務協調者存在。而 rocketmq本身提供的儲存機制為事務訊息提供了持久化能力,rocketmq 的高可用機制以及可靠訊息設計則為事務訊息在系統發生異常時依然能夠保證達成事務的最終一致性。

rocketmq事務訊息實際上是對本地訊息表的乙個封裝,將本地訊息表移動到了mq內部,解決 producer 端的訊息傳送與本地事務執行的原子性問題。執行流程如下:

(1)producer傳送事務訊息

producer (mq傳送方)傳送事務訊息至mq server,mq server將訊息狀態標記為prepared(預備狀態),注

意此時這條訊息消費者(mq訂閱方)是無法消費到的。

(2)mq server回應訊息傳送成功

mq server接收到producer 傳送給的訊息則回應傳送成功表示mq已接收到訊息。

(3)producer 執行本地事務

producer 端執行業務**邏輯,通過本地資料庫事務控制。

(4)訊息投遞

若producer 本地事務執行成功則自動向mqserver傳送commit訊息,mq server接收到commit訊息後將訊息狀態標記為可消費,此時mq訂閱方即正常消費訊息;若producer 本地事務執行失敗則自動向mqserver傳送rollback訊息,mq server接收到rollback訊息後,將刪除訊息 。

mq訂閱方消費訊息,消費成功則向mq回應ack,否則將重複接收訊息。這裡ack預設自動回應,即程式執行正常則自動回應ack。

(5)事務回查

如果執行producer端本地事務過程中,執行端掛掉,或者超時,mq server將會不停的詢問同組的其他 producer

來獲取事務執行狀態,這個過程叫事務回查。mq server會根據事務回查結果來決定是否投遞訊息。

以上主幹流程已由rocketmq實現,對使用者側來說,使用者需要分別實現本地事務執行以及本地事務回查方法,因此

只需關注本地事務的執行狀態即可。roacketmq提供rocketmqlocaltransactionlistener介面:

分布式事務解決方案之訊息佇列

本方案是將分布式事務拆分成多個本地事務來完成,並且由訊息佇列非同步協調完成,如下圖 下邊以下單減少庫存為例來說明 1 訂單服務和庫存服務完成檢查和預留資源。2 訂單服務在本地事務中完成新增訂單表記錄和新增 減少庫存任務訊息 3 由定時任務根據訊息表的記錄傳送給 mq通知庫存服務執行減庫存操作。4 庫...

事務 分布式事務解決方案

事務acid特性 事務隔離級別 指的是讀和寫同時出現時出現的資料不一致問題。事務的一致性問題 存在問題問題描述 髒讀 dirty read 針對的是單條資料。即乙個更新操作a修改了某一條資料,但尚未提交該事務,此時另乙個讀操作b來查詢該條資料,讀到的是修改後的但尚未提交的資料。不可重複讀 unrep...

分布式事務解決方案

一 結合mq訊息中介軟體實現的可靠訊息最終一致性 二 tcc補償性事務解決 三 最大努力通知型方案 第一種方案 可靠訊息最終一致性,需要業務系統結合mq訊息中介軟體實現,在實現過程中需要保證訊息的成功傳送及成功消費。即需要通過業務系統控制mq的訊息狀態 第二種方案 tcc補償性,分為三個階段tryi...