1.默認情況下,如果消費者程序出現異常的情況下會自動實現補償機制。
2.@RabbitListener
RabbitListener底層使用AOP攔截,如果程序沒有拋出異常會自動提交事務,如果發生異常的話,會實現自動補償機制,消息會緩存到RabbitMQ服務端進行存放,程序會一直嘗試消費這條消息,直到程序不拋出異常爲止。
3.重試機制配置:
#rabbitmq配置
rabbitmq:
####連接地址
host: 39.108.107.163
####端口號
port: 5672
####賬號
username: root
####密碼
password: root
### 地址
virtual-host: /distributeds
#重試機制設置
listener:
simple:
retry:
####開啓消費者重試
enabled: true
####最大重試次數
max-attempts: 5
####重試間隔秒數(3s)
initial-interval: 3000
4.如何選擇重試機制
如果消費者獲取消息後,需要調用第三方接口,但接口暫時無法訪問-----需要重試機制(根據接口的返回結果判斷,如果結果異常(爲空)直接拋出一個異常 ,RabbitListener底層使用AOP攔截進行重試)。
如果消費者獲取消息後,消費者程序發生異常(數據轉換異常,空指針異常等需要更新代碼解決的)-----不需要重試機制(因爲 重試還是會失敗,應該採用日誌記錄消費失敗的消息,然後進行人工補償)
5.如何解決冪等性問題
產生原因:網絡延遲傳輸中,會造成進行MQ重試中,在重試過程中,可能會造成重複消費。
解決辦法:
使用全局MessageID,解決冪等性。
生產者生產消息的時候加上唯一的ID,並且把該ID存放到redis中,ID作爲Key,value默認爲0,消費者獲取到消息ID後去redis中查詢,如果value爲0代表該消息沒有被消費過,消費者消費完信息後將該ID的value改爲1。