-
IBPS V3分布式事務方案支持
TCC
、可靠消息最終一致性
。
-
可以混合使用,即通用業務使用
可靠消息最終一致性
,強一致要求的場景下視同TCC
方案。
TCC是三個首字母,兩個微服務間同時進行 如果Confirm時有一個服務有問題,則會轉向Cancel,相當于進行Confirm的逆向操作。
可靠消息最終一致性
此方案涉及 3 個模塊:
- 上游應用,執行業務并發送 MQ 消息。
- 可靠消息服務和 MQ 消息組件,協調上下游消息的傳遞,并確保上下游數據的一致性。
- 下游應用,監聽 MQ 的消息并執行自身業務。
第一階段:上游應用執行業務并發送 MQ 消息
-
上游應用發送待確認消息到可靠消息系統。
-
可靠消息系統保存待確認消息并返回。
-
上游應用執行本地業務。
-
上游應用通知可靠消息系統確認業務已執行并發送消息。
-
可靠消息系統修改消息狀態為發送狀態并將消息投遞到 MQ 中間件。
以上每一步都可能出現失敗情況,分析一下這 5 步出現異常后上游業務和消息發送是否一致:
上游應用執行完成,下游應用尚未執行或執行失敗時,此事務即處于 BASE 理論的 Soft State 狀態。
第二階段:下游應用監聽 MQ 消息并執行業務
下游應用監聽 MQ 消息并執行業務,并且將消息的消費結果通知可靠消息服務。
可靠消息的狀態需要和下游應用的業務執行保持一致,可靠消息狀態不是已完成時,確保下游應用未執行,可靠消息狀態是已完成時,確保下游應用已執行。
下游應用和可靠消息服務之間的交互圖如下:-
下游應用監聽 MQ 消息組件并獲取消息。
-
下游應用根據 MQ 消息體信息處理本地業務。
-
下游應用向 MQ 組件自動發送 ACK 確認消息被消費。
-
下游應用通知可靠消息系統消息被成功消費,可靠消息將該消息狀態更改為已完成。
以上每一步都可能出現失敗情況,分析一下這 4 步出現異常后下游業務和消息狀態是否一致:
異常處理一:消息狀態確認
- 可靠消息查詢超時的待確認狀態的消息。
- 向上游應用查詢業務執行的情況。
- 業務未執行,則刪除該消息,保證業務和可靠消息服務的一致性。業務已執行,則修改消息狀態為已發送,并發送消息到 MQ 組件。
異常處理二:消息重發
- 可靠消息服務定時查詢狀態為已發送并超時的消息。
- 可靠消息將消息重新投遞到 MQ 組件中。
- 下游應用監聽消息,在滿足冪等性的條件下,重新執行業務。
- 下游應用通知可靠消息服務該消息已經成功消費。
通過消息狀態確認和消息重發兩個功能,可以確保上游應用、可靠消息服務和下游應用數據的最終一致性