RabbitMQ消費失敗重試策略、及重試策略應用場景詳解-創(chuàng)新互聯(lián)

前言:
RabbitMQ消費者一般情況下,如果消費失敗出現(xiàn)異常,那么消費端默認是無限重試消費,這樣就會帶來非常不好的一個情況,就是陷入死循環(huán),一直報錯一直重試。所以我們需要對消費異常重試次數(shù)、重試間隔時間進行限制

專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)振安免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

一、限制消費異常重試次數(shù)、重試間隔時間

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           # 開啟消費者出現(xiàn)異常情況下,進行重試消費,默認false
          max-attempts: 5         # 大重試次數(shù),默認為3
          initial-interval: 3000  # 重試間隔時間,默認1000(單位毫秒)

其中 retry?節(jié)點及以下的屬性就是重試策略

2、驗證重試策略是否生效
這里使用一張 user?信息表作演示

【1】演示代碼

@RabbitListener(queues = {MqConstants.DIRECT_QUEUE_1})
    public void listenerDirectQueue1(Message message, Channel channel) throws IOException {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();

        //驗證消費失敗(出現(xiàn)異常)重試策略 start
        String msgBody = new String(message.getBody());
        System.out.println("消費者接收到消息:【" + msgBody + "】");
        int i = 1 / 0;
        channel.basicAck(deliveryTag, false);
        //驗證消費失敗(出現(xiàn)異常)重試策略 end
    }

模擬了一個除數(shù)為0的異常

【2】演示結(jié)果

從控制臺輸出可以看出,異常后嘗試了5次后仍然失敗,就放棄重試,符合預期結(jié)果

二、消息消費異常重試策略應用場景,并不是所有消息異常后都需要重試

1、說明:
【1】比如我們調(diào)用第三方接口、或者調(diào)用別的服務的接口,那么這時候出現(xiàn)異常要不要重試?當然要重試,因為調(diào)用接口異常可能是網(wǎng)絡波動導致,并不是業(yè)務代碼異常,所以重試后可能就可以正常調(diào)用
【2】比如我們在消費過程中,業(yè)務代碼出現(xiàn)異常(空指針、除數(shù)為0等)這類代碼不健壯導致的異常,那么這時候需要重試嗎?當然不需要重試,因為業(yè)務代碼異常就算重試再多次也依然會異常,代碼異常需要發(fā)版修復解決,所以重試沒有意義。這種情況我們可以把代碼塊 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());

        //驗證消費失敗(出現(xiàn)異常)重試策略 start
        try {
            System.out.println("消費者接收到消息:【" + msgBody + "】");
            int i = 1 / 0;
            channel.basicAck(deliveryTag, false);
        } catch (Exception e) {
            log.info("異常消息:" + msgBody);
            //此時可以把異常消息寫入表中,以供人工或定時任務做重試補償
            channel.basicAck(deliveryTag, false);
        }
        //驗證消費失敗(出現(xiàn)異常)重試策略 end
    }

可以看見異常被捕捉了,所以沒有觸發(fā)重試策略

小結(jié):
在 catch?塊中不要拋出異常就不會觸發(fā)重試策略,在 catch?塊中我們把該條消息記錄到日志數(shù)據(jù)表或者其他特定的表,以供過后人工或定時任務單獨處理異常消息補償即可

2、應用場景總結(jié):
【1】類似調(diào)用第三方接口這種場景出現(xiàn)異常,需要重試
【2】業(yè)務代碼出現(xiàn)異常(空指針、除數(shù)為0等)這類代碼不健壯導致的異常,不需要重試,沒有意義
【3】異常不需要觸發(fā)重試策略的消息,需要把該條消息記錄到日志數(shù)據(jù)表或者其他特定的表,以供過后人工或定時任務單獨處理異常消息補償

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

名稱欄目:RabbitMQ消費失敗重試策略、及重試策略應用場景詳解-創(chuàng)新互聯(lián)
文章分享:http://bm7419.com/article0/dihjio.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、標簽優(yōu)化、靜態(tài)網(wǎng)站、網(wǎng)站策劃服務器托管、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設公司