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

news/2025/3/29 9:11:24/

一、背景

在对阿里云成本分析的时候,发现SLS日志的费用暴增,由平均每月的2000元突然增至6000多。
在这里插入图片描述
查看日志的费用明细,按应收金额降序得知,原来是某个java服务打印的jvm日志暴增。
在这里插入图片描述

再已进入SLS查看打印的日志量,更是惊呆了。。。

在这里插入图片描述
不仅是打印的数量多,打印的时间点是遍布整天24小时。

也就是说,该日志是整天整夜地打印,像是进入了死循环。

围绕着这个问题,尝试让AI给我回答原因是什么。

可能是我提问水平不够,未能准确得出答案,在排查这个问题的过程中,代码是一分钟就定位出。

但是,围绕着mq消费者是如何消费消息的原理,总是不甚明了。

于是,我整理了两篇文章,希望能把个问题说明清楚,最后也会对此作出总结。

二、报错日志

[ntContainer#2-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.support.ListenerExecutionFailedException

详细错误:

java">[ntContainer#2-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener method 'public void com.xxx.interfaces.listener.XxxQueueListener.xxx(java.lang.String)' threw exceptionat org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:227)at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:147)at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:132)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1579)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1498)at sun.reflect.GeneratedMethodAccessor174.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at brave.spring.rabbit.TracingRabbitListenerAdvice.invoke(TracingRabbitListenerAdvice.java:101)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)at org.springframework.amqp.rabbit.listener.$Proxy360.invokeListener(Unknown Source)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1486)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1477)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1421)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:958)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:908)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:81)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1279)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1185)at java.lang.Thread.run(Thread.java:748)Caused by: com.xxx.common.exception.ResponseException: 资源不存在或已被删除at sun.reflect.GeneratedMethodAccessor175.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:53)at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:219)... 23 common frames omitted

代码定位:

消息监听者在消费消息的时候,业务判断的时候,对于非法的数据进行抛异常ResponseException, 提示资源不存在或已被删除。

要知道消息在首次消费后,下一步会做什么,就必须得看看程序的mq配置项了。

rabbitmq_76">三、rabbitmq配置项

在这里插入图片描述

spring:rabbitmq:host: xxxusername: xxxxport: 5672publisher-confirms: truevirtual-host: xxxxx

这里既没有配置acknowledge-mode确认模式,也没有配置retry重试策略。

也就是说,一个mq消息状态要从Ready状态转入完成状态,前提是消息监听者正常执行。

像本例中,由于抛异常,会导致该mq消息的状态从Ready状态转入Unacked状态。

rabbitmq_95">四、rabbitmq监控

1、投递mq消息

在这里插入图片描述

此时,消息队列中有一个消息,其状态是Ready。

2、开始监听mq消息

java程序由于抛出异常,不断打印上述错误日志。

而此时的mq消息状态则是:

在这里插入图片描述

消息的状态已变成了Unacked,队列的消息总数也才1个,但是消息投递速度却停不下来。

究其原因,是mq消息进入投递的死循环,在消费的时候抛异常,导致未能消费成功消息。

3、停止监听mq消息

java应用停止时,mq消息的状态就又从Unacked回到了Ready状态。

在这里插入图片描述
此时消息队列的投递速度又重归于零了。

因为没有了消息监听者。

下一篇,我们将进一步分析该问题,并总结一下mq消息消费的整个过程,以及我们应该如何合理配置。


http://www.ppmy.cn/news/1583215.html

相关文章

Spring Task 定时任务处理

1.Spring Task 任务调度工具 2.cron表达式 SpringBootApplication EnableTransactionManagement //开启注解方式的事务管理 EnableCaching//开启springboot2.x的redis缓存 EnableScheduling//开启定时任务 Slf4j public class SkyApplication {public static void main(String[…

‌I2C 与 SPI 总线线数对比表

‌协议‌‌线数类型‌‌信号线组成‌‌特点‌‌典型应用场景‌‌I2C‌‌标准 2 线‌- SDA(双向数据线) - SCL(时钟线)- 地址寻址,无需片选线 - 多主多从架构,布线简单低速传感器、EEPROM、RTC‌扩展 4 线‌…

Ubuntu20.04系统安装IsaacSim4.5与IsaacLab环境

Introduction 今天用自己的Ubuntu20.04系统安装最新更新的IsaacSim 4.5 与 最新版的IsaacLab遇到了问题,且这个问题组里师兄之前也遇到了,我的解决方法是从头来过,所及记录一下。 IsaacSim现在支持pip安装,但是Ubuntu20.04的pip…

pytorch小记(十五):pytorch中 交叉熵损失详解:为什么logits比targets多一个维度?

pytorch小记(十五):pytorch中 交叉熵损失详解:为什么logits比targets多一个维度? PyTorch交叉熵损失详解:为什么logits比targets多一个维度?一、前言:新手常见困惑二、核心概念&…

html5炫酷3D数字时钟项目开发实践

炫酷3D数字时钟项目开发实践 这里写目录标题 炫酷3D数字时钟项目开发实践项目概述技术栈核心技术实现1. 3D翻转效果实现2. 数字显示与翻转动画3. 霓虹灯发光效果4. 时间更新逻辑 技术难点与解决方案1. 3D翻转动画的流畅性2. 数字更新的同步性3. 发光效果的性能优化 项目总结项目…

2025年移动端开发性能优化实践与趋势分析

启动速度优化 本质:缩短首次可见帧渲染时间。 方法: iOS:利用Core ML本地模型轻量化部署,减少云端等待。Android:强制启用SplashScreen API,通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…

【SOC 芯片设计 DFT 学习专栏 -- IDDQ 测试 与 Burn-In 测试】

文章目录 IDDQ 测试与 Burn-In 测试IDDQ 测试工作原理测试过程优点局限性示例 2. Burn-In 测试工作原理测试过程优点局限性示例 总结对比 IDDQ 测试和 Burn-in 测试: IDDQ 测试与 Burn-In 测试 本文将详细介绍 DFT 中 IDDQ测试 和 burn-in测试模式 IDDQ 测试 IDD…

PLC物联网网关是什么?PLC网关应用场景

PLC物联网网关是一种特殊的物联网设备,用于连接和集成工业自动化系统中的PLC(可编程逻辑控制器)与互联网。它作为一个中间节点,实现了PLC与云平台、其他设备或系统之间的数据传输和通信。 PLC是一种广泛应用于工业控制领域的可编程…