前言:
RabbitMQ消費者一般情況下,如果消費失敗出現異常,那么消費端默認是無限重試消費,這樣就會帶來非常不好的一個情況,就是陷入死循環,一直報錯一直重試。所以我們需要對消費異常重試次數、重試間隔時間進行限制
一、限制消費異常重試次數、重試間隔時間
1、配置限制策略,如下:
rabbitmq:
host: xxx
port: 5672
username: guest
password: guest
virtual-host: /
listener:
simple:
default-requeue-rejected: false
acknowledge-mode: manual # 確認模式為手動確認-需要在代碼中手動ACK
retry:
enabled: true # 開啟消費者出現異常情況下,進行重試消費,默認false
max-attempts: 5 # 大重試次數,默認為3
initial-interval: 3000 # 重試間隔時間,默認1000(單位毫秒)
其中 retry?節點及以下的屬性就是重試策略
2、驗證重試策略是否生效
這里使用一張 user?信息表作演示
【1】演示代碼
@RabbitListener(queues = {MqConstants.DIRECT_QUEUE_1})
public void listenerDirectQueue1(Message message, Channel channel) throws IOException {
long deliveryTag = message.getMessageProperties().getDeliveryTag();
//驗證消費失敗(出現異常)重試策略 start
String msgBody = new String(message.getBody());
System.out.println("消費者接收到消息:【" + msgBody + "】");
int i = 1 / 0;
channel.basicAck(deliveryTag, false);
//驗證消費失敗(出現異常)重試策略 end
}
模擬了一個除數為0的異常
【2】演示結果
從控制臺輸出可以看出,異常后嘗試了5次后仍然失敗,就放棄重試,符合預期結果
二、消息消費異常重試策略應用場景,并不是所有消息異常后都需要重試
1、說明:
【1】比如我們調用第三方接口、或者調用別的服務的接口,那么這時候出現異常要不要重試?當然要重試,因為調用接口異常可能是網絡波動導致,并不是業務代碼異常,所以重試后可能就可以正常調用
【2】比如我們在消費過程中,業務代碼出現異常(空指針、除數為0等)這類代碼不健壯導致的異常,那么這時候需要重試嗎?當然不需要重試,因為業務代碼異常就算重試再多次也依然會異常,代碼異常需要發版修復解決,所以重試沒有意義。這種情況我們可以把代碼塊 try?catch?一下:
@RabbitListener(queues = {MqConstants.DIRECT_QUEUE_1})
public void listenerDirectQueue1(Message message, Channel channel) throws IOException {
long deliveryTag = message.getMessageProperties().getDeliveryTag();
String msgBody = new String(message.getBody());
//驗證消費失敗(出現異常)重試策略 start
try {
System.out.println("消費者接收到消息:【" + msgBody + "】");
int i = 1 / 0;
channel.basicAck(deliveryTag, false);
} catch (Exception e) {
log.info("異常消息:" + msgBody);
//此時可以把異常消息寫入表中,以供人工或定時任務做重試補償
channel.basicAck(deliveryTag, false);
}
//驗證消費失敗(出現異常)重試策略 end
}
可以看見異常被捕捉了,所以沒有觸發重試策略
小結:
在 catch?塊中不要拋出異常就不會觸發重試策略,在 catch?塊中我們把該條消息記錄到日志數據表或者其他特定的表,以供過后人工或定時任務單獨處理異常消息補償即可
2、應用場景總結:
【1】類似調用第三方接口這種場景出現異常,需要重試
【2】業務代碼出現異常(空指針、除數為0等)這類代碼不健壯導致的異常,不需要重試,沒有意義
【3】異常不需要觸發重試策略的消息,需要把該條消息記錄到日志數據表或者其他特定的表,以供過后人工或定時任務單獨處理異常消息補償
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
名稱欄目:RabbitMQ消費失敗重試策略、及重試策略應用場景詳解-創新互聯
文章分享:http://m.newbst.com/article0/dihjio.html
成都網站建設公司_創新互聯,為您提供做網站、標簽優化、靜態網站、網站策劃、服務器托管、建站公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯