分散式事務最終一致性
第一階段:上游應用執行業務併發送 MQ 訊息
上游應用將本地業務執行和訊息傳送繫結在同一個本地事務中,保證要麼本地操作成功併發送 MQ 訊息,要麼兩步操作都失敗並回滾。
上游應用和可靠訊息之間的業務互動圖如下:
- 上游應用傳送待確認訊息到可靠訊息系統
- 可靠訊息系統儲存待確認訊息並返回
- 上游應用執行本地業務
- 上游應用通知可靠訊息系統確認業務已執行併發送訊息。
- 可靠訊息系統修改訊息狀態為傳送狀態並將訊息投遞到 MQ 中介軟體。
以上每一步都可能出現失敗情況,分析一下這 5 步出現異常後上遊業務和訊息傳送是否一致
上游應用執行完成,下游應用尚未執行或執行失敗時,此事務即處於 BASE 理論的 Soft State 狀態。
第二階段:下游應用監聽 MQ 訊息並執行業務
下游應用監聽 MQ 訊息並執行業務,並且將訊息的消費結果通知可靠訊息服務。
可靠訊息的狀態需要和下游應用的業務執行保持一致,可靠訊息狀態不是已完成時,確保下游應用未執行,可靠訊息狀態是已完成時,確保下游應用已執行。
下游應用和可靠訊息服務之間的互動圖如下:
- 下游應用監聽 MQ 訊息元件並獲取訊息
- 下游應用根據 MQ 訊息體資訊處理本地業務
- 下游應用向 MQ 元件自動傳送 ACK 確認訊息被消費
- 下游應用通知可靠訊息系統訊息被成功消費,可靠訊息將該訊息狀態更改為已完成。
以上每一步都可能出現失敗情況,分析一下這 4 步出現異常後下遊業務和訊息狀態是否一致:
通過分析以上兩個階段可能失敗的情況,為了確保上下游資料的最終一致性,在可靠訊息系統中,需要開發 訊息狀態確認 和 訊息重發 兩個功能以實現 BASE 理論的 Eventually Consistent 特性。
異常處理一:訊息狀態確認
可靠訊息服務定時監聽訊息的狀態,如果存在狀態為待確認並且超時的訊息,則表示上游應用和可靠訊息互動中的步驟 4 或者 5 出現異常。
可靠訊息則攜帶訊息體內的資訊向上遊應用發起請求查詢該業務是否已執行。上游應用提供一個可查詢介面供可靠訊息追溯業務執行狀態,如果業務執行成功則更改訊息狀態為已傳送,否則刪除此訊息確保資料一致。具體流程如下:
- 可靠訊息查詢超時的待確認狀態的訊息
- 向上遊應用查詢業務執行的情況
- 業務未執行,則刪除該訊息,保證業務和可靠訊息服務的一致性。業務已執行,則修改訊息狀態為已傳送,併發送訊息到 MQ 元件。
異常處理二:訊息重發
訊息已傳送則表示上游應用已經執行,接下來則確保下游應用也能正常執行。
可靠訊息服務發現可靠訊息服務中存在訊息狀態為已傳送並且超時的訊息,則表示可靠訊息服務和下游應用中存在異常的步驟,無論哪個步驟出現異常,可靠訊息服務都將此訊息重新投遞到 MQ 元件中供下游應用監聽。
下游應用監聽到此訊息後,在保證冪等性的情況下重新執行業務並通知可靠訊息服務此訊息已經成功消費,最終確保上游應用、下游應用的資料最終一致性。具體流程如下:
- 可靠訊息服務定時查詢狀態為已傳送並超時的訊息
- 可靠訊息將訊息重新投遞到 MQ 元件中
- 下游應用監聽訊息,在滿足冪等性的條件下,重新執行業務。
- 下游應用通知可靠訊息服務該訊息已經成功消費。
通過訊息狀態確認和訊息重發兩個功能,可以確保上游應用、可靠訊息服務和下游應用資料的最終一致性。