1. 程式人生 > >RocketMQ 解決訊息重複投遞的問題

RocketMQ 解決訊息重複投遞的問題

業務與訊息耦合的情況下會產生訊息重複投遞,因為支付寶儲存了訊息記錄,餘額寶處理成功之後需要傳送處理成功的訊息給支付寶。支付寶進行確認之後,把訊息記錄狀態刪除或者做變更。而我們的業務與訊息解耦的方式則不需要考慮訊息重複投遞的問題。因為 我們完全信任MQ中介軟體。

第一種方式的訊息重複投遞問題說明:

以我們的支付吧轉賬到餘額寶為例,如果相同的訊息被重複投遞兩次,那麼我們的餘額寶賬戶會增加2萬而不是1萬。

為什麼相同的訊息會被重複投遞?比如餘額寶處理完訊息msg後,傳送了處理成功的訊息給支付寶,正常情況下支付寶應該要刪除訊息msg, 但如果支付寶這時候掛了,重啟後一看msg還在,就會繼續傳送訊息msg。

解決辦法

:在餘額寶這邊增加訊息應用狀態表(message_apply),通俗來講就是個賬本,用於記錄訊息的消費情況,每次來一個訊息,在真正執行之前先去訊息應用狀態表查詢一遍,如果說明是重複訊息,丟棄即可,如果沒有找到才執行,同時插入到訊息 應用狀態 表 (同一事務)。