真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站設(shè)計服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)振安免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(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次后仍然失敗,就放棄重試,符合預(yù)期結(jié)果

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

1、說明:
【1】比如我們調(diào)用第三方接口、或者調(diào)用別的服務(wù)的接口,那么這時候出現(xiàn)異常要不要重試?當(dāng)然要重試,因為調(diào)用接口異??赡苁蔷W(wǎng)絡(luò)波動導(dǎo)致,并不是業(yè)務(wù)代碼異常,所以重試后可能就可以正常調(diào)用
【2】比如我們在消費過程中,業(yè)務(wù)代碼出現(xiàn)異常(空指針、除數(shù)為0等)這類代碼不健壯導(dǎo)致的異常,那么這時候需要重試嗎?當(dāng)然不需要重試,因為業(yè)務(wù)代碼異常就算重試再多次也依然會異常,代碼異常需要發(fā)版修復(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);
            //此時可以把異常消息寫入表中,以供人工或定時任務(wù)做重試補償
            channel.basicAck(deliveryTag, false);
        }
        //驗證消費失敗(出現(xiàn)異常)重試策略 end
    }

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

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

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

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


當(dāng)前名稱:RabbitMQ消費失敗重試策略、及重試策略應(yīng)用場景詳解-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://weahome.cn/article/dihjio.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部