訊息中介軟體保證訊息一致性解決方案
1、訊息中介軟體的應用場景
(1)非同步通訊
(2)解耦
(3)併發緩衝
2、訊息傳送和投遞的不可靠性
(1)分散式網路進行就引入了資料傳輸的不確定性
(2)也就是CAP理論中的P(分割槽容錯性)
(3)跨網路通訊產生了分散式事務問題
3、訊息傳送一致性
(1)是指產生訊息的業務動作與訊息傳送的一致
(2)也就是說,如果業務操作成功,那麼由這個業務操作所產生的訊息一定要成功投遞出去,否則就丟訊息。
4、一致性如何保障?
假設這兒有兩部操作
a、支付訂單處理 b、 傳送會計原始憑證(傳送訊息)
問題?
如果業務操作成功,執行訊息傳送前應用故障,訊息發不出去,導致訊息丟失(訂單系統與會計系統的資料不一致)
如果業務操作成功,應用正常,但訊息系統故障或網路故障,也會導致訊息發不出去(訂單系統與會計系統的資料不一致);
5、JMS標準中的XA協議方式是否可以保障訊息傳送一致性?
(1)JMS協議標準中的API中,有很多以XA開頭的介面,其實就是支援XA協議(兩階段提交協議)的全域性事務型介面。
(2)JMS中的XA系列介面,可以提供分散式事務支援。
(3)但引用了XA方式的分散式事務,又會帶來很多的侷限
①要求業務操作的資源必須支援XA協議(並不是所有資源都支援XA)
②兩階段提交協議的成本
③持久化成本等DYP模型的侷限性(全域性鎖定,成本高,效能低)
(4)引入XA違背了柔性事務的初衷!
6、變通的做法
(1)主動方應用先把訊息傳送給訊息中介軟體,訊息狀態標記為待確認;
(2)訊息中介軟體收到訊息之後,把訊息持久化到訊息儲存中,但並不向被動方應用投遞訊息;
(3)訊息中介軟體返回訊息持久化結果(成功,或者失效),主動方應用根據返回結果進行判斷如何處理業務操作處理;
①失敗:放棄業務操作處理,結束(必須向上層返回失敗結果)
②成功:執行業務操作處理
(4)業務操作完成後,把業務操作結果(成功/失敗)傳送給訊息中介軟體;
(5)訊息中介軟體收到業務操作結果後,根據結果進行處理;
①失敗:刪除訊息儲存中的訊息,結束;
②成功:更新訊息儲存中的訊息狀態為·待發送(可傳送)·,緊接著執行訊息投遞;
(6)前面的正向流程都成功後,向被動方應用投遞訊息;