Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(下)

news2025/3/29 1:23:32

一、消费流程图

在这里插入图片描述

消息在消费出现异常的时候,将一直保留在消息队列,所以你会看到以下奇怪的现象:

在这里插入图片描述
消息队列仅有5个消息, 投递速度也非常快,结果却一直无法消费掉。

二、重试策略

重试机制的使用场景:重试机制适用于那些可能因为临时问题(如网络问题、外部服务不可用等)导致处理失败的情况。

自定义重试逻辑:可以通过自定义错误处理器(如 RepublishMessageRecoverer)来实现更复杂的重试逻辑,例如记录重试次数并根据条件决定是否重新投递。

无限重试可能导致问题:如果消息本身存在问题(如格式错误),无限重试会导致大量日志输出,且可能阻塞队列。

本文就是中了此招,带来的后果就是SLS费用剧增。

1、重试次数

开启重试,设置重试的次数、间隔时间。

在计算间隔时间的时候,使用指数级增长,而非简单的倍数。

        listener:
            simple:
                retry:
                    enabled: true
                    max-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: true
                    max-attempts: 5
                    initial-interval: 10000
                    max-interval: 30000
                    multiplier: 3
                acknowledge-mode: auto
                default-requeue-rejected: false

自动确认模式(AUTO)

在自动确认模式下,当消费者接收到消息后,Spring AMQP 会自动向 RabbitMQ 发送确认消息(ACK),表示消息已被成功消费。这意味着:

  • 优点:实现简单,不需要手动确认消息,适合简单的消费场景。
  • 缺点:如果消费者在处理消息时抛出异常,消息会被认为已经消费成功,从队列中移除,不会重新投递。这可能导致消息丢失。

手动确认模式(MANUAL)

在手动确认模式下,消费者需要显式地调用确认方法(basicAck 或 basicNack)来确认消息。这意味着:

  • 优点:可以更灵活地控制消息的确认时机,确保消息在成功处理后才被确认,从而避免消息丢失。
  • 缺点:实现相对复杂,需要在代码中手动处理确认逻辑。

四、总结

消息在消费的时候,如果出现异常,直接抛弃,不想进入重试流程。
你可能会配置修改如下:

        listener:
            simple:
                retry:
                    enabled: false

回到最上面的流程图,其实还是无法解决消息消费失败的死循环。

虽然不会进入重试, 但是在消费消息的时候,由于抛异常,又会进入消息队列。

最终导致死循环。

解决方法是: 对于不想要重试,而又不陷入死循环。那么就只有一个办法,使用个大大的try-catch住消息监听方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道

文章目录 一、啥是 AI 的 Hallucination?二、啥时候容易出现幻觉?1. 知识边界之外的问题2. 模糊或不明确的输入3. 生成长篇内容4. 多模态任务中的误解5. 过度自信的语气要求 三、幻觉为啥会出现?原理是啥?1. 概率预测的本质2. 训练…

核心知识——论文详解

引入 在2010年,来自Berkeley的博士生 Matei Zaharia 发表了一篇论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。伴随着这篇论文的,是一个开源系统,也就是 Spark。在之后的几年里&…

LeetCode hot 100 每日一题(15)——48.旋转图像

这是一道难度为中等的题目,让我们来看看题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…

屏幕后处理Post-Processing安装及使用

一、安装Post-Processing插件 在 Window --- PackageManager 中搜索并安装 Post-Processing 二、添加后处理效果步骤 给场景中的相机Camera添加 Post - process Layer,只有添加了该组件的相机才会进行相应的后处理,此组件允许您为该后处理层配置抗锯齿…

探索Halo:不止是博客,更是创作新宇宙

开篇:邂逅 Halo 作为一名热爱写作与分享的博主,拥有一个称手的博客系统一直是我的追求。在探索博客系统的旅程中,我尝试过不少平台,从 WordPress 到 Hexo ,每一次转换都是为了寻找那个最完美的 “写作伴侣”。 WordP…

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中,设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制,为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度,解析如何利用LuatOS实现Air8201的智能电源…

开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o

在人工智能领域,构建能够像人类一样理解、思考和行动的智能体(AI Agent)一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期,国内人工智能公司MiniMax重磅开源了其…

Java面试第十三山!《设计模式》

大家好,我是陈一。如果文章对你有帮助,请留下一个宝贵的三连哦~ 万分感谢! 一、设计模式入门指南 1. 什么是设计模式? 设计模式是可复用的解决方案模板,用于解决软件开发中常见的架构问题。如同建筑领域的…

vue 点击放大,图片预览效果

背景: 在使用vue框架element组件的背景下,我们对图片的展示需要点击放大(单张);如果是多张图片,要支持左右滑动查看多张图片(多张)。 单张图片放大,el-image图片组件,或者原生的img标签。 多张图片放大&…

笛卡尔轨迹规划之齐次变换矩阵与欧拉角、四元数的转化

一、笛卡尔轨迹规划需求 笛卡尔轨迹规划本质就是我们对机械臂的末端位置和姿态进行规划,其实也就是对末端坐标系的位姿进行规划。我们清楚末端坐标系的位姿是可以用齐次变换矩阵T来表示的,但这样表示的话,并不利于我们去做规划,所…

NPU上如何使能pytorch图模式

1 Pytorch的compile技术 PyTorch 的 torch.compile 是一个强大的功能,用于优化 PyTorch 模型的性能。它通过将 PyTorch 的动态图转换为静态图,并利用 Just-In-Time(JIT)编译技术,显著提高模型的推理速度和训练效率。 …

进制转换(c++)

由于进制转换属于基础且比较重要,所以我就写一个博客方便自己复习,过程中如有错误,还请指出。 常用的进制有二进制,八进制,十进制和十六进制。 常用的进制转换就是十进制转换成其他进制和其他进制转换成十进制 我们先…

2025-03-24 学习记录--C/C++-PTA 习题7-7 字符串替换

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 习题7-7 字符串替换 本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换&#…

为什么TCP需要三次握手?一次不行吗?

文章目录 1. 三次握手的过程2. 为什么需要三次握手?3. 握手过程中每一步的具体作用4. 简单比喻5. 为什么是三次握手,而不是两次或四次?6. 三次握手中的序列号有什么作用?7. 总结 1. 三次握手的过程 三次握手是建立 TCP 连接的过程…

SpringBoot2集成Elasticsearch8(使用spring-boot-starter-data-elasticsearch)

写在前面 使用spring-boot-starter-data-elasticsearch集成Elasticsearch8? What? 官方写的不支持啊?让我们来看下官方给出的版本建议。 官方地址: https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/versions.…

【平台优化】持续调度参数在高负载大集群中的影响

持续调度参数在高负载大集群中的影响 背景介绍2种调度通信方式对集群的影响社区相关的讨论结论 背景介绍 这几年经历了我们大数据的Yarn集群的几次扩容,集群从原先的800多台增加到1300多台到现在的1600多台,在集群规模不断增加的过程中,有遇…

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别(大数据时代)的数据。ES 也使用 Java 开…

(一)飞行器的姿态欧拉角, 欧拉旋转, 完全数学推导(基于坐标基的变换矩阵).(偏航角,俯仰角,横滚角)

(这篇写的全是基矢变换矩阵)不是坐标变换矩阵,坐标变换矩阵的话转置一下,之后会有推导. 是通过M转置变换到P撇点.

基于Spring Boot + Vue的银行管理系统设计与实现

基于Spring Boot Vue的银行管理系统设计与实现 一、引言 随着金融数字化进程加速,传统银行业务向线上化转型成为必然趋势。本文设计并实现了一套基于Spring Boot Vue的银行管理系统,通过模块化架构满足用户、银行职员、管理员三类角色的核心业务需求…

数据库基础知识点(系列一)

1.数据库的发展历史分哪几个阶段?各有什么特点? 答:数据库技术经历了人工管理阶段、文件系统阶段和数据库系统三个阶段。 1)人工管理阶段 这个时期数据管理的特点是: 数据由计算或处理它的程序自行携带…