免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

RabbitMQ消費失敗重試策略、及重試策略應用場景詳解-創新互聯

前言:
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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設公司