1 出現場景
rabbitmq 默認情況下,如果消費者程序出現異常,會自動實現補償機制
消費者出現異常,消息不會消費成功
2 實現原理
2.1 @RabbitListener
@RabbitListener底層,使用Aop進行攔截,如果程序沒有拋出異常,自動提交事務
如果Aop使用異常通知攔截 獲取異常信息的話,自動實現補償機制 ,該消息會緩存到rabbitmq服務器端進行存放,一直重試到不拋異常爲準。
3 自定義重試
spring:
rabbitmq:
# 連接地址
host: 127.0.0.1
# 端口號
port: 5672
# 賬號
username: guest
# 密碼
password: guest
# 地址
virtual-host: /
listener:
simple:
retry:
# 開啓消費者(程序出現異常的情況下會)進行重試
enabled: true
# 最大重試次數
max-attempts: 5
# 重試間隔次數
initial-interval: 3000
# 開啓手動ack
acknowledge-mode: manual
4 如何選擇重試機制
4.1 需要重試
調用第三方接口,提示連接超時,可以重試
通常來說:無需發佈版本即可解決的異常都可以重試
4.2 無需重試
系統異常,如:空指針,數據轉換異常等
通常來說:需發佈版本即可解決的異常都無需重試
採用日誌記錄+定時任務+人工補償進行解決
5 冪等性
設置消息id,如果消息消費成功,不在消費
如果業務邏輯中存在唯一id,如訂單id,也可用訂單id判重