首页 > 其他分享 >rabbitmq MessageConverter消息接收异常 一直unacked 解决

rabbitmq MessageConverter消息接收异常 一直unacked 解决

时间:2024-11-26 18:56:41浏览次数:2  
标签:MessageConverter unacked rabbitmq rejected ack 消息 requeue true

rabbitmq MessageConverter消息接收异常 一直unacked 解决

rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    listener:
      simple:
        concurrency: 1 # Minimum number of consumers.
        max-concurrency: 20 # Maximum number of consumers.
        prefetch: 50
        default-requeue-rejected: true #意思是,消息被拒后(即未消费),重新(true)放入队列
        retry:
          enabled: true #是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息)
          max-attempts: 3
          initial-interval: 5000ms

这样,消费端发现了异常,尝试了规定次数后,这条“问题消息”就会被解决(如果设置了死信队列,就被送到了死信队列;否则直接扔掉)。是开启了“消费者重试尝试”的功劳。
如果不开启该模式,那么会无限的循环下去。和 “default-requeue-rejected: true”参数没有任何关系,
“消费者重试”模式会覆盖掉default-requeue-rejected(默认为true)。所以,只要是开了该模式,异常就可以被解决。
如果只设置 default-requeue-rejected: true(消费者重试未开启,应答方式为默认),那么会无限报错!

1.事故重现-磁盘占用飙升
一开始我不知道代码有问题,就是以为单纯的没有进行ack所以将ack模式改成auto自动,紧急升级了,这样不管正常与否,消息都会被签收,所以在当时确实是解决了问题。
其实现在回想起来是非常危险的操作的,将ack模式改成auto自动,这样会使QOS不生效。会出现大量消息涌入consumer从而造成consumer宕机,可以是因为当时在晚上,交易比较少,并且推送系统有多个节点,才没出现问题。

日志打印循环报错打印,导致服务器磁盘空间不够引起服务挂了。

2.原因
RabbitMQ消息监听程序异常时,consumer会向rabbitmq server发送Basic.Reject,表示消息拒绝接受,由于Spring默认requeue-rejected配置为true,消息会重新入队,然后rabbitmq server重新投递。就相当于死循环了,所以控制台在疯狂刷错误日志造成磁盘利用率飙升的原因。

3.复现方法:
在rabbitMq web客户端通过队列发送错误格式的数据,查看日志在频繁的刷新。

4.解决方法
将default-requeue-rejected: false即可。

5.总结
个人建议,生产环境不建议使用自动ack,这样会QOS无法生效。
在使用手动ack的时候,需要非常注意消息签收。
其实在将有问题的MQ重置时,是将错误的消息给清除才没有问题了,相当于是消息丢失了。

try {
// 业务逻辑。
}catch (Exception e){
// 输出错误日志。
}finally {
// 消息签收。
}

6.扩展:
试着把rabbitmq的配置改成手动确认消息:
spring.rabbitmq.listener.simple.acknowledge-mode=manual
spring.rabbitmq.listener.direct.acknowledge-mode=manual
然后把确认消息的代码
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
放在finally{}里


7.如何终止错误格式的消息反复投递:
rabbitmq队列清理
在web管理端可以进行操作,选择到要操作的队列,下拉里面有一个Purge(不要选到delete), 点击之后,查看”Unasked“数量.

 

标签:MessageConverter,unacked,rabbitmq,rejected,ack,消息,requeue,true
From: https://www.cnblogs.com/oktokeep/p/18570782

相关文章

  • rabbitmq环境,c#程序接收q,(未完成)
    b站up主,雪忆微服务来源bilibili雪忆微服务的分享第一步:下载并安装erlang原因:RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装RabbitMQ的前提是安装Erlang。下载地址:http://www.erlang.org/downloadshttps://github.com/erlang/otp/releases/tag/OTP-24.0Erlang包,......
  • RabbitMQ---如何保证MQ幂等性?
    保证MQ幂等性通常是指保证消费者消费消息的幂等性。1、使用数据库的唯一约束去控制。添加唯一索引保证添加数据的幂等性。例如,对于订单处理场景,将订单号设置为唯一约束。当重复插入具有相同订单号的订单记录时,数据库会抛出异常,从而保证幂等性2、使用token机制总结:发送......
  • springboot 整合 rabbitMQ (延迟队列)
    前言:延迟队列是一个内部有序的数据结构,其主要功能体现在其延时特性上。这种队列存储的元素都设定了特定的处理时间,意味着它们需要在规定的时间点或者延迟之后才能被取出并进行相应的处理。简而言之,延时队列被设计用于存放那些需要在特定时间到达时才处理的元素。使用场景:1、......
  • 【深入理解RabbitMQ】七大工作模式
    文章目录七种工作模式介绍简单模式基本概念代码实现工作队列模式基本概念代码实现发布订阅模式基本概念代码实现路由模式基本概念代码实现通配符模式基本概念代码实现`RPC`(远程过程调用模式)基本概念代码实现`PublisherConfirms`(发布确认模式)`MQ`是如何保证消息的......
  • RabbitMQ5:Fanout交换机、Direct交换机、Topic交换机
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......
  • RabbitMQ4:work模型
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......
  • RabbitMQ 入门(七)SpringAMQP五种消息类型(Direct Exchange)
    一、发布订阅-DirectExchange(路由模式)在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。DirectExchange会将接收到的消息根据规则路由到指定queue,因此称为路由模式(r......
  • RabbitMQ 入门(四)SpringAMQP五种消息类型(Basic Queue)
    一、SpringAMQP简介SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。SpringAmqp的官方地址:https://spring.io/projects/spring-amqpSpringAMQP提供了三个功能:-自动声明队列、交换机及其绑定关系-基于注解的......
  • RabbitMQ 入门(五)SpringAMQP五种消息类型(Work Queue)
    一、WorkQueue(工作消息队列)Workqueues,也被称为(Taskqueues),任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。此时就可以......
  • RabbitMQ2:介绍、安装、快速入门、数据隔离
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......