《RabbitMQ 消息中間件》如何保證消息可靠性

前言

開發過程中遇到問題,要保證MQ消息一定被消費。

經過

情況一:

這種情況下:MQ已經發送出去,但是這個事務其實已經被回滾。

情況二:

這種情況下,MQ發送如果出現問題,就導致MQ消息沒有發送。

情況三:

服務A發送消息後, 其實是不知道服務B是否處理消息。 

如何使用MQ的同步機制,服務A繼續收到服務B處理消息的反饋又違背了我們使用MQ的初衷(異步處理)。

整改(消息可靠性)

發送端改造:

這樣可以保證消息和其他的SQL語句的事務保持一致,要不一起成功,要不一起失敗。

單獨線程處理已經落庫的消息,發送給服務B,並且一定要等到服務B給出消息處理的ACK纔將自己的消息置成已經處理,不再發送。

這樣就保證了服務B一定會消費消息,不消費也都能很容易的發現和重新發送消息。

接收端改造:

因爲服務A是輪詢發送未處理的消息,所以在服務B已經消息,但是通知服務A的時候失敗,就會導致服務A重新發送消息,這樣服務B再次接收到消息就不應該處理而是應該

拋棄。

通過判斷唯一識別碼,來實現冪等,保證消息不被重複處理。

總結

MQ消息帶來了便利,同時也對應的帶來了風險。如果需要保證數據安全,可以考慮作者的這種方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章