rabbitMq两种消费应答失败处理方式

在rabbitMq消费端,有三种应答模式:

none:不处理。即消息投递给消费者后立刻 ack 消息会立刻从MQ删除。非常不安全,不建议使用

manual:手动模式。需要自己在业务代码中调用api,发送 ack 或 reject,存在业务入侵,但更灵活

auto:自动模式。SpringAMQP利用AOP对我们的消息处理逻辑做了环绕增强,当业务正常执行时则自动返回 ack 。当业务出现异常时,根据异常判断返回不同结果:

如果是业务异常,会自动返回 nack

如果是消息处理或校验异常,自动返回 reject

none基本用不到,在这不做讨论

一、auto模式(默认模式),这种是在配置文件中直接设置参数进行处理。

复制代码
#应答模式 手动应答需要开发者手动应答
spring.rabbitmq.listener.simple.acknowledge-mode=AUTO
 
#批量预抓取数量,提高执行效率
spring.rabbitmq.listener.simple.prefetch = 10
#开启消费者重试机制
spring.rabbitmq.listener.simple.retry.enabled = true
#重试的最大次数
spring.rabbitmq.listener.simple.retry.max-attempts = 6
#重试间隔时间
spring.rabbitmq.listener.simple.retry.initial-interval = 3000
#重试间隔倍数,默认值是1
spring.rabbitmq.listener.simple.retry.multiplier = 2
#最大间隔时间,默认值是10s
spring.rabbitmq.listener.simple.retry.max-interval = 15000

消费时,会按照参数进行重试,如果达到最大重试次数还没有成功,会丢弃掉消息。

如果在消费时还没走完整个方法而停止整个服务,则在重新启动服务时会重新消费这个消息。

二、manual手动应答,此配置下,上面配置文件设置的重试参数都不会生效,需要特别注意。

1、手动应答模式需要用户自己决定消息是丢弃或者重新放回队列,还可以结合死信队列对消息进行重试处理。

2、手动应答中两个重要方法basicAck、basicNack

channel.basicAck(long deliveryTag, boolean multiple);

channel.basicNack(long deliveryTag, boolean multiple, boolean requeue) ;

复制代码
手动模式 若消息没成功消费时,若给队列拒绝(basicNack),则会进入死循环,若不给拒绝(不进行basicAck) 抛出异常(重试机制生效) 则消息会堆积在队列中,后续投递的消息也会堆积并不会被消费
相关推荐
月落归舟6 小时前
从单机到分布式:互联网系统架构演进全流程
分布式·系统架构
搬砖柯7 小时前
系列12-接口压测怎么做成平台能力?自研 httpx 引擎、分布式 Worker 与 Locust 选型对照
分布式·测试工具·性能优化·开源·自动化·httpx
折哥的程序人生 · 物流技术专研8 小时前
Java面试通关⑭:分布式理论与架构全集
分布式·微服务·校招·分布式事务·cap·java面试·最终一致性
格子软件19 小时前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
Evand J1 天前
【论文复现】MATLAB例程,存在测距误差的WSN无锚点分布式自定位,《WSN中存在测距误差的无锚点分布式自定位方法》
开发语言·分布式·matlab·定位·导航·wsn
格子软件1 天前
2026年分布式GEO代理流量调度:源码级状态机防重挂实战
java·vue.js·人工智能·spring boot·分布式·vue
2301_801184751 天前
kafka-zookeeper
分布式·zookeeper·kafka
大明者省1 天前
四大模态大模型训练体系全解析(架构+范式+分布式+算力成本·)
笔记·分布式·架构
格子软件1 天前
2026年分布式GEO代理架构:多租户动态数据源隔离与流控源码解构
java·vue.js·人工智能·分布式·架构·vue·geo
nbsaas-boot1 天前
微服务架构下的分布式事务解决方案深度对比与实战选型
分布式·微服务·架构