前言
開發過程中遇到問題,要保證MQ消息一定被消費。
經過
情況一:
這種情況下:MQ已經發送出去,但是這個事務其實已經被回滾。
情況二:
這種情況下,MQ發送如果出現問題,就導致MQ消息沒有發送。
情況三:
服務A發送消息後, 其實是不知道服務B是否處理消息。
如何使用MQ的同步機制,服務A繼續收到服務B處理消息的反饋又違背了我們使用MQ的初衷(異步處理)。
整改(消息可靠性)
發送端改造:
這樣可以保證消息和其他的SQL語句的事務保持一致,要不一起成功,要不一起失敗。
單獨線程處理已經落庫的消息,發送給服務B,並且一定要等到服務B給出消息處理的ACK纔將自己的消息置成已經處理,不再發送。
這樣就保證了服務B一定會消費消息,不消費也都能很容易的發現和重新發送消息。
接收端改造:
因爲服務A是輪詢發送未處理的消息,所以在服務B已經消息,但是通知服務A的時候失敗,就會導致服務A重新發送消息,這樣服務B再次接收到消息就不應該處理而是應該
拋棄。
通過判斷唯一識別碼,來實現冪等,保證消息不被重複處理。
總結
MQ消息帶來了便利,同時也對應的帶來了風險。如果需要保證數據安全,可以考慮作者的這種方式。