Rabbitmq消息被消費時拋異常,進入Unacked 狀態,進而導致消費者不斷嘗試消費(下)

一、消費流程圖

在這里插入圖片描述

消息在消費出現異常的時候,將一直保留在消息隊列,所以你會看到以下奇怪的現象:

在這里插入圖片描述
消息隊列僅有5個消息, 投遞速度也非常快,結果卻一直無法消費掉。

二、重試策略

重試機制的使用場景:重試機制適用于那些可能因為臨時問題(如網絡問題、外部服務不可用等)導致處理失敗的情況。

自定義重試邏輯:可以通過自定義錯誤處理器(如 RepublishMessageRecoverer)來實現更復雜的重試邏輯,例如記錄重試次數并根據條件決定是否重新投遞。

無限重試可能導致問題:如果消息本身存在問題(如格式錯誤),無限重試會導致大量日志輸出,且可能阻塞隊列。

本文就是中了此招,帶來的后果就是SLS費用劇增。

1、重試次數

開啟重試,設置重試的次數、間隔時間。

在計算間隔時間的時候,使用指數級增長,而非簡單的倍數。

        listener:simple:retry:enabled: truemax-attempts: 5  # 最大重試次數initial-interval: 10000  # 初始重試間隔(毫秒)max-interval: 30000 # 最大重試間隔(毫秒)multiplier: 3 # 重試間隔的乘數因子

2、死信隊列

為了避免消息無限重試,建議配置死信隊列。當消息達到最大重試次數后,將其發送到死信隊列,以便后續處理。

        listener:simple:default-requeue-rejected: false

通過合理配置重試機制和死信隊列,可以有效避免消息無限重試導致的問題,同時確保消息的可靠處理。

建立死信消息監聽者,對消息的最后處理,如果還是失敗,則發送告警消息給相關人員。

當消費者在處理消息時拋出異常且達到最大重試次數后,消息會被拒絕并發送到死信隊列,從而避免消息丟失并便于后續處理。

三、消息確認模式

在 Spring AMQP 的默認配置中,acknowledge-mode 的默認值是 AUTO,即自動確認模式。

最終rabbitmq的配置見下:

        listener:simple:retry:enabled: truemax-attempts: 5initial-interval: 10000max-interval: 30000multiplier: 3acknowledge-mode: autodefault-requeue-rejected: false

自動確認模式(AUTO)

在自動確認模式下,當消費者接收到消息后,Spring AMQP 會自動向 RabbitMQ 發送確認消息(ACK),表示消息已被成功消費。這意味著:

  • 優點:實現簡單,不需要手動確認消息,適合簡單的消費場景。
  • 缺點:如果消費者在處理消息時拋出異常,消息會被認為已經消費成功,從隊列中移除,不會重新投遞。這可能導致消息丟失。

手動確認模式(MANUAL)

在手動確認模式下,消費者需要顯式地調用確認方法(basicAck 或 basicNack)來確認消息。這意味著:

  • 優點:可以更靈活地控制消息的確認時機,確保消息在成功處理后才被確認,從而避免消息丟失。
  • 缺點:實現相對復雜,需要在代碼中手動處理確認邏輯。

四、總結

消息在消費的時候,如果出現異常,直接拋棄,不想進入重試流程。
你可能會配置修改如下:

        listener:simple:retry:enabled: false

回到最上面的流程圖,其實還是無法解決消息消費失敗的死循環。

雖然不會進入重試, 但是在消費消息的時候,由于拋異常,又會進入消息隊列。

最終導致死循環。

解決方法是: 對于不想要重試,而又不陷入死循環。那么就只有一個辦法,使用個大大的try-catch住消息監聽方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74541.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74541.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【STM32】知識點介紹二:GPIO引腳介紹

文章目錄 一、概述二、GPIO的工作模式三、寄存器編程 一、概述 GPIO(英語:General-purpose input/output),即通用I/O(輸入/輸出)端口,是STM32可控制的引腳。STM32芯片的GPIO引腳與外部設備連接起來,可實現與外部通訊、…

JavaScript流程控制精講(二)運算符與循環實戰

JavaScript流程控制精講(二)運算符與循環實戰 學習目標:掌握條件判斷與循環控制,實現基礎業務邏輯 核心要點:運算符優先級 | 短路運算 | 循環優化 | 項目實戰 一、運算符進階技巧 1.1 算術運算符 console.log(5 % 3)…

如何在IPhone 16Pro上運行python文件?

在 iPhone 16 Pro 上運行 Python 文件需要借助第三方工具或遠程服務,以下是具體實現方法和步驟: 一、本地運行方案(無需越獄) 使用 Python 編程類 App 以下應用可在 App Store 下載,支持直接在 iPhone 上編寫并運行 …

【趙渝強老師】達夢數據庫的數據庫對象

達夢數據庫中包含各種數據庫對象,主要分為兩大類型:基本數據庫對象和復雜數據庫對象。下面分別進行介紹。 視頻講解如下 【趙渝強老師】達夢數據庫的數據庫對象 一、 基本數據庫對象 常見的基本數據庫對象有:表、索引、視圖、序列、同義詞等…

【每日算法】Day 6-1:哈希表從入門到實戰——高頻算法題(C++實現)

摘要 :掌握高頻數據結構!今日深入解析哈希表的核心原理與設計實現,結合沖突解決策略與大廠高頻真題,徹底掌握O(1)時間復雜度的數據訪問技術。 一、哈希表核心思想 哈希表(Hash Table) 是一種基于鍵值對的…

LeetCode 第29題、30題

LeetCode 第29題:兩數相除 題目描述 給你兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法、除法和取余運算。整數除法應該向零截斷,也就是截去其小數部分。例如,8.345將被截斷為8,-2.733…

26考研——樹與二叉樹_樹、森林(5)

408答疑 文章目錄 二、樹、森林樹的基本概念樹的定義和特性樹的定義樹的特性 基本術語樹的基本術語和概念祖先、子孫、雙親、孩子、兄弟和堂兄弟結點的層次、度、深度和高度樹的度和高度分支結點和葉結點有序樹和無序樹路徑和路徑長度 森林的基本術語和概念森林的定義森林與樹的…

【HarmonyOS Next之旅】DevEco Studio使用指南(六)

目錄 1 -> 在模塊中添加Ability 1.1 -> Stage模型添加UIAbility 1.1.1 -> 在模塊中添加UIAbility 1.1.2 -> 在模塊中添加Extension Ability 2 -> 創建服務卡片 2.1 -> 概述 2.2 -> 使用約束 2.3 -> 創建服務卡片 2.4 -> 創建動態/靜態卡片…

Langchain 多模態輸入和格式化輸出

多模態輸入 圖片處理(最高頻) 1.1 URL形式(推薦大文件) from langchain.schema import HumanMessage from langchain.chat_models import ChatOpenAIchat ChatOpenAI(model"gpt-4-vision-preview")message HumanMes…

Excel多級聯動下拉菜單的自動化設置(使用Python中的openpyxl模塊)

1 主要目的 在Excel中,經常會遇到需要制作多級聯動下拉菜單的情況,要求單元格內填寫的內容只能從指定的多個選項中進行選擇,并且需要設置多級目錄,其中下級目錄的選項內容要根據上級目錄的填寫內容確定,如下圖所示&am…

3.25-1 postman執行+弱網測試

1.導出json腳本 2.打包json文件 3.下載的文件 二 .導入腳本 選擇文件 點擊導入 導入的接口 三.多接口運行 (1)集合右鍵,點擊run ,運行多個接口 2.編輯環境,集合,執行次數等 運行多個接口 四.運行多個接口…

Pear Admin Flask 開發問題

下載代碼請復制以下命令到終端執行 git clone https://gitee.com/pear-admin/pear-admin-flask 于是我下載git 完成安裝后: 安裝 Git 后出現的頁面是 “Git for Windows 的版本發布說明(Release Notes)”,通常會在安裝完成后自動彈…

12-scala樣例類(Case Classes)

例類(Case classes)和普通類差不多,只有幾點關鍵差別,接下來的介紹將會涵蓋這些差別。樣例類非常適合用于不可變的數據。 定義一個樣例類 一個最簡單的樣例類定義由關鍵字case class,類名,參數列表&#…

cmakelist中添加opencv

版本選擇 qt的msvc,版本2019 opencv版本 4.5.3 配置了環境變量 x64下的v14中的bin 配置頭文件 {"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}","d:\\QT\\6.5.3\\msvc20…

【C語言】文件操作(詳解)

個人主頁 今天我們來講一下有關文件的相關操作,希望看完這篇文章對你有所幫助,大力感謝你對博主的支持! 文章目錄 ?一、為什么使用文件🎉二、什么是文件2.1 程序文件2.2 數據文件2.3 文件名 🎡三、二進制文件和文本…

基于web的家政服務網站

內容摘要 由于互聯網的使用,人們在管理、應用、服務等領域使用數據更加簡潔、方便,大大提高了工作效率。互聯網正逐漸融入我們的生活,影響和改變我們的生活。 家政服務管理系統是典型的信息管理系統(MIS)。其開發主要…

【leetcode hot 100 739】每日溫度

解法一&#xff1a;暴力解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int ntemperatures.length; // 指向要找下一個更高溫度的地方int[] result new int[n];for(int left0;left<n;left){int rightleft1; // 指向正在找最高溫度的地方wh…

藍橋杯C++基礎算法-0-1背包(優化為一維)

這段代碼實現了0-1 背包問題的動態規劃解法&#xff0c;并且使用了滾動數組來優化空間復雜度。以下是代碼的詳細思路解析&#xff1a; 1. 問題背景 給定 n 個物品&#xff0c;每個物品有其體積 v[i] 和價值 w[i]&#xff0c;以及一個容量為 m 的背包。目標是選擇物品使得總價值…

算法 | 麻雀搜索算法原理,公式,改進算法綜述,應用場景及matlab完整代碼

一、麻雀搜索算法(SSA)原理 1. 算法基礎 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一種群體智能優化算法,靈感來源于麻雀群體的覓食與反捕食行為。算法將麻雀分為三類角色:發現者(Producer):適應度最高,負責探索全局最優區域;加入者(Follower)…

SQL 版本歷史

SQL&#xff08;Structured Query Language&#xff09;是一種用于管理和操作關系數據庫的標準語言。SQL標準由多個組織制定和維護&#xff0c;主要包括以下幾個版本&#xff1a; SQL-86 (SQL-87): 這是SQL的第一個官方標準&#xff0c;由ANSI&#xff08;美國國家標準協會&…