目錄
三、基於可靠訊息的最終一致性方案詳解
在電商領域等網際網路場景下,傳統的事務在資料庫效能和處理能力上都暴露出了瓶頸。柔性事務有兩個特性:基本可用和柔性狀態。所謂基本可用是指分布式系統出現故障的時候允許損失一部分的可用性。柔性狀態是指允許系統存在中間狀態,這個中間狀態不會影響系統整體的可用性,比如資料庫讀寫分離的主從同步延遲等。柔性事務的一致性指的是最終一致性。
訊息傳送一致性是指產生訊息的業務動作與訊息傳送一致,也就是說如果業務操作成功,那麼由這個業務操作所產生的訊息一定要傳送出去,否則就丟失。
處理方式一
public void completeorderservice()
在上面的情況中,如果業務操作成功,執行的訊息傳送之前應用發生故障,訊息傳送不出去,導致訊息丟失,將會產生訂單系統與會計系統的資料不一致。如果訊息系統或者網路異常,也會導致訊息傳送不出去,也會造成資料不一致。
處理方式二
public void completeorderservice()
如果將上面的兩個操作調換一下順序,這種情況就會更加不可控了,訊息發出去了業務訂單可能會失敗,會造成訂單系統與業務系統的資料不一致。那麼jms標準中的xa協議是否可以保障傳送的一致性?
傳送訊息:主動方現將應用把訊息發給訊息中介軟體,訊息狀態標記為「待確認」狀態。
訊息中介軟體收到訊息後,把訊息持久化到訊息儲存中,但是並不影響被動方投遞訊息。
訊息中介軟體返回訊息持久化結果,主動方根據返回的結果進行判斷如何進行業務操作處理:
失敗:放棄執行業務操作處理,結束,必要時向上層返回處理結果。
成功:執行業務操作處理。
業務操作完成後,把業務操作結果返回給訊息中介軟體。
訊息中介軟體收到業務操作結構後,根據業務結果進行處理:
失敗:刪除訊息儲存中的訊息,結束。
成功:更新訊息儲存中的訊息狀態為「待傳送」,然後執行訊息投遞。
前面的正向流程都成功之後,向被動方應用投遞訊息。
但是在上面的處理流程中,任何乙個環節都有可能出現問題。
對於未確認的訊息,採用按規則重新投遞的方式進行處理。對於以上流程,訊息重**送會導致業務處理介面出現重複呼叫的問題。訊息消費過程中訊息重**送的主要原因就是消費者成功接收處理完訊息後,訊息中介軟體沒有及時更新投遞狀態導致的。如果允許訊息重**送,那麼消費方應該實現業務介面的冪等性設計。
示例訊息資料表:
名稱資料型別
允許空預設值
屬性釋義
uuid
varchar(50)no—
unique
uuid
version
int(11)no0
—版本號
editer
varchar(100)
yesnull
—修改者
creater
varchar(100)
yesnull
—建立者
edit_time
datetime
yes0000-00-00 00:00:00
—最後修改時間
create_time
datetime
no0000-00-00 00:00:00
—建立時間
msg_id
varchar(50)no—
—訊息id
msg_body
longtextno—
—訊息內容
msg_date_type
varchar(50)
yes—
—訊息資料型別
consumer_queue
varchar(100)no—
—消費佇列
send_times
int(6)no0
—訊息重發次數
is_dead
varchar(20)no—
—是否死亡
status
varchar(20)no—
—狀態remark
varchar(200)
yes——備註
field0
varchar(200)
yes—
—擴充套件欄位0
field1
varchar(200)
yes—
—擴充套件欄位1
field2
varchar(200)
yes—
—擴充套件欄位2
不積跬步,無以至千里;不積小流,無以成江河。
分布式事務中常見的三種解決方案
三 基於可靠訊息的最終一致性方案詳解 在電商領域等網際網路場景下,傳統的事務在資料庫效能和處理能力上都暴露出了瓶頸。柔性事務有兩個特性 基本可用和柔性狀態。所謂基本可用是指分布式系統出現故障的時候允許損失一部分的可用性。柔性狀態是指允許系統存在中間狀態,這個中間狀態不會影響系統整體的可用性,比如資料...
分布式事務中的三種解決方案詳解
toc 在電商領域等網際網路場景下,傳統的事務在資料庫效能和處理能力上都暴露出了瓶頸。柔性事務有兩個特性 基本可用和柔性狀態。所謂基本可用是指分布式系統出現故障的時候允許損失一部分的可用性。柔性狀態是指允許系統存在中間狀態,這個中間狀態不會影響系統整體的可用性,比如資料庫讀寫分離的主從同步延遲等。柔...
分布式事務中的三種解決方案詳解
toc 在電商領域等網際網路場景下,傳統的事務在資料庫效能和處理能力上都暴露出了瓶頸。柔性事務有兩個特性 基本可用和柔性狀態。所謂基本可用是指分布式系統出現故障的時候允許損失一部分的可用性。柔性狀態是指允許系統存在中間狀態,這個中間狀態不會影響系統整體的可用性,比如資料庫讀寫分離的主從同步延遲等。柔...