1. 主動方應用先把消息發給消息中間件,消息狀態標記爲「待確認」;
2. 消息中間件收到消息後,把消息持久化到消息存儲中,但並不向被動方應用投遞消息;
3. 消息中間件返回消息持久化結果(成功/失敗),主動方應用根據返回結果進行判斷如何進行業務操做處理:
a) 失敗:放棄業務操做處理,結束(必要時向上層返回失敗結果);
b) 成功:執行業務操做處理;
4. 業務操做完成後,把業務操做結果(成功/失敗)發送給消息中間件;
5. 消息中間件收到業務操做結果後,根據業務結果進行處理;
a) 失敗:刪除消息存儲中的消息,結束;
b) 成功:更新消息存儲中的消息狀態爲「待發送(可發送)」,緊接着執行消息投遞;
6. 前面的正向流程都成功後,向被動方應用投遞消息;網絡
任何一個環節均可能會出問題!spa
一、從主動方應用的角度來分析:中間件
異常狀況 | 可能的狀態 | 一致性 |
---|---|---|
預發送消息失敗 | 消息未進存儲,業務操做未執行(可能的緣由:主動方應用、網絡、消息中間件、消息存儲) | 一致 |
預發送消息後,主動方應用沒有收到返回消息存儲結果 | (1)消息未進存儲,業務操做未執行 | 一致 |
(2)消息已進存儲(待確認),業務操做未執行 | 不一致 | |
收到消息存儲成功的返回結果,但未執行業務操做就失敗 | 消息已進存儲(待確認),業務操做未執行 | 不一致 |
二、從消息中間件的角度來分析:ci
異常狀況 | 可能的狀態 | 一致性 |
---|---|---|
消息中間件沒有收到主動方應用的業務操做處理結果 | (1)消息已進存儲(待確認),業務操做未執行(或業務操做出錯回滾了) | 不一致 |
(2)消息已進存儲(待確認),業務操做成功 | 不一致 | |
消息中間件收到業務操做結果(成功/失敗),但處理消息存儲中的消息狀態失敗 | (1)消息已進存儲(待確認),業務操做未執行(或業務操做出錯回滾了) | 不一致 |
(2)消息已進存儲(待確認),業務操做成功 | 不一致 |
異常狀況總結及處理table
異常狀況 | 一致性 | 異常處理方法 |
---|---|---|
消息未進存儲,業務操做未執行 | 一致 | |
消息已進存儲(狀態待確認),業務 操做未執行 |
不一致 | 確認業務操做結果,處理消息(刪除消息) |
消息已進存儲(狀態待確認),業務 操做成功 |
不一致 | 確認業務操做結果,處理消息 (更新消息狀態,執行消息投遞) |
異常處理流程也有可能發生異常,
又該怎麼處理呢?方法