簡介
開發中會經常使用都消息中間件來進行消息同步操作。但往往會因爲各種原因導致消息在投遞至消息代理服務器的過程出現意外。確保消息同步的高可靠,至少需要做到兩點:
同步失敗記錄:確保清楚哪些消息同步失敗;
再次投遞消息:確保在失敗後,會自動嘗試重新發送消息,排除因網絡原因導致消息投遞失敗。
處理方案
- 由sendUtils投遞消息到消息代理服務器MQ Broker時,會同時保存一未接收狀態status=0到數據庫中
- 當消息成功投遞到Broker時,Broker會返回一個確認信息到生產者的回調監聽器中Confirm Listener
- 當Confirm Listener中接收到確認消息,同時更新數據庫中對應消息的接收狀態status=1
- 額外有個定時器Timer,定時對數據庫中消息狀態爲未接收的消息 進行第二次投遞
- 當多次投遞數count > 3時,將狀態更新爲status=2並不再繼續投遞
關鍵配置(RabbitMQ示例)
# 確認消息發送成功,通過實現ConfirmCallBack接口,消息發送到交換器Exchange後觸發回調
spring.rabbitmq.publisher-confirms=true
# 實現ReturnCallback接口,如果消息從交換器發送到對應隊列失敗時觸發
# (比如根據發送消息時指定的routingKey找不到隊列時會觸發)
spring.rabbitmq.publisher-returns=true