解决rabbitmq的重复消息和消息丢失

消息丢失

在这里插入图片描述
我们来看消息在什么情况下会丢失,我们得理解消息产生和消费的过程。
1.生产者产生消息,投递到rabbimq-server时,投递到队列成功,返回确认时,网络连接断开了,导致消息投递失败。
这里有2种解决方式,
1.同步单条或批量确认
同步确认机制对性能损耗太大,一般不采用
2.异步确认
实现异步确认接口,根据消息的唯一id,来判断,消息是否被投递成功,如若未投递成功可以维护一个消息唯一id和消息体的map映射,开启一个线程,决定是否继续投递。
在这里插入图片描述
在这里插入图片描述

消费端消息确认机制

消费端消息确认分自动确认和手动确认
自动确认:,可以指定autoAck参数,当autoAck=true时,一旦消费者接收到了消息,就视为自动确认了消息。在springboot整合rabbitmq模块中,在消费端消费消息抛出异常后,会自动重入队列。自动确认可能会存在消息丢失的情况,比如在spring的事物中回滚啊,等等。
手动确认消息
当autoAck=false时,需要消费端手动确认消息,
tag为channel连接中,接受消息的一个递增整数.,multiple 为是否批量确认,requeue 为是否继续入队

   确认消息方法
    void basicAck(long deliveryTag, boolean multiple) throws IOException;

   拒绝消息 可批量,决定是否重入队列,如果false,则消息会进入死信队列
    void basicNack(long deliveryTag, boolean multiple, boolean requeue)
            throws IOException;

  拒绝消息单个消息,决定是否重入队列,如果false,则消息会进入死信队列
    void basicReject(long deliveryTag, boolean requeue) throws IOException;

例如
在这里插入图片描述
重复性的消息还是要在消费端,保证幂等性,

参考

https://www.jianshu.com/p/6579e48d18ae

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于 RabbitMQ 消息丢失消息积压和消息重复的问题,一般可以从以下几个方面进行排查和解决: 1. 消息丢失: - 确保生产者成功发送消息RabbitMQ,可以通过确认机制(publisher confirms)来确保消息的可靠性发送。 - 确保消费者正确地从 RabbitMQ 接收消息并进行处理,可以使用消费者确认机制(consumer acknowledgements)来确保消息的可靠消费。 2. 消息积压: - 检查消费者的处理速度是否跟得上消息的生产速度,如果消费者处理速度较慢,会导致消息积压。可以增加消费者数量或优化消费者的处理逻辑来提高消费速度。 - 调整 RabbitMQ 的队列参数,包括队列的最大长度、最大优先级等,以适应不同的场景需求。 3. 消息重复: - 在生产者端,可以使用唯一标识符来标记每条消息,避免重复发送相同消息。 - 在消费者端,可以使用幂等性操作来处理消息,即使消息重复消费也不会产生错误结果。例如,使用数据库的唯一键或者记录操作日志来避免重复处理。 此外,还可以考虑以下几点来提高 RabbitMQ 的可靠性和性能: - 使用持久化消息,确保消息RabbitMQ 服务器重启后不会丢失。 - 配置合适的消息 TTL(Time-To-Live)时间,防止长时间积压过期消息。 - 使用合适的集群和镜像队列设置,提高 RabbitMQ 的可用性和容错性。 希望以上信息能对您有所帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值