RabbitMQ消息丢失怎么办?三种场景原因和解决方案详解

 更新时间:2026年09月12日 10:43:05   作者:小沈同学呀  
还在为RabbitMQ消息丢失头疼吗?本文详细剖析生产者、Broker、消费者三个环节的丢失原因,并给出事务、confirm模式、持久化、手动ACK等实战解决方案,帮你确保消息可靠送达

RabbitMq简介

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。

RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

RabbitMq工作模型

producer生产者生产消息,发送到绑定了queue队列的exchange交换机上,并进入到指定的queue队列,最后推送到consumer消费端。

RabbitMq消息丢失情况

1、producer生产者丢失消息

2、broker消息中间件自身丢失消息

3、consumer消费者丢失消息

RabbitMq消息丢失原因及解决方案

1、producer生产者丢失消息

原因:生产者发送消息由于网络等原因并没有发送到RabbitMq

解决方案:

1.1、开启RabbitMq事务机制

  • 生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消 息,
  • 如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit,
  • 类似我们数据库数据库事务机制。

1.2、开启 confirm 模式

  • 在生产者端设置开启 confirm 模式之后,你每次写的消息都会分配一个唯一的 ID,然后如果写入了 RabbitMQ 中,RabbitMQ 会给你回传一个 ack 消息,告诉你说这个消息已经收到。
  • 如果 RabbitMQ 没能处理这个消息,会回调你的一个 nack 接口,告诉你这个消息接收失败,你可以重试。
  • 而且可以结合这个机制在自己业务里维护每个消息 ID 的状态,如果超过一定时间还没接收到这个消息的回调,那么可以业务主动重发。

事务机制和 confirm 机制优劣:

  • 事务机制是同步的,提交一个事务之后会阻塞,吞吐量会下来,耗性能。
  • confirm 机制是异步的,流程不会阻塞,吞吐量较高,性能较好。

2、broker消息中间件自身丢失消息

原因:RabbitMq收到生产者的消息后还没有来得及持久化到磁盘,又或者创建队列没有持久化以及消息并没有设置为持久化,在Mq故障宕机后都会有消息丢失的情况。

解决方案:

2.1、创建队列queue的时候设置队列持久化

2.2、mq配置deliveryMode == 2 消息持久化

重点:必须同时设置队列持久化和消息持久化,再结合生产者的confrim模式,才能保证消息准确投递到broker并保证进入磁盘。

3、consumer消费者丢失消息

原因:消费者自动ack配置情况下,业务代码异常或者其他故障消息并没有处理完成也会自动ack。RabbitMq消息ack后就会丢弃,这就导致异常情况下的消息丢失了。

解决方案:

3.1 关闭RabbitMq自动ack

业务代码成功消费了消息手动调用Mq ack,让Mq丢弃消息;

如果业务代码异常则直接nack,让Mq重新推送消息进行处理。

当然,在要求比较高的情况下也可以异常数据进入死信队列,保证数据的完整性。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Json 自定义使用函数的简单实例

    Json 自定义使用函数的简单实例

    下面小编就为大家带来一篇Json 自定义使用函数的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Java字符串拼接新方法 StringJoiner用法详解

    Java字符串拼接新方法 StringJoiner用法详解

    在本篇文章中小编给大家分享的是一篇关于Java字符串拼接新方法 StringJoiner用法详解,需要的读者们可以参考下。
    2019-09-09
  • SpringBoot拦截器怎么用?从入门到实战的详细教程

    SpringBoot拦截器怎么用?从入门到实战的详细教程

    还在为SpringMVC中的横切关注点发愁?本文用快递分拣的通俗类比,带你彻底搞懂拦截器的定位、执行流程和实战用法,从登录验证到日志记录,揭秘拦截器如何优雅处理请求,并对比过滤器差异,让你轻松掌握拦截器核心技巧
    2026-07-07
  • 轻松了解java中Caffeine高性能缓存库

    轻松了解java中Caffeine高性能缓存库

    本文我们将学习了解到用于Java的高性能缓存库Caffeine,其使用Window TinyLfu清理策略,提供最佳的命中率
    2021-08-08
  • Java实现更新顺序表中的指定元素的示例

    Java实现更新顺序表中的指定元素的示例

    本文主要介绍了Java实现更新顺序表中的指定元素的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java中参数传递方式详解

    java中参数传递方式详解

    这篇文章主要介绍了java中参数传递方式详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • java中String的常见用法总结

    java中String的常见用法总结

    以下是关于string的七种用法,注意哦,记得要时常去查看java的API文档,那个里面也有很详细的介绍
    2013-10-10
  • Java 读取、获取配置文件.properties中的数据

    Java 读取、获取配置文件.properties中的数据

    这篇文章主要介绍了Java 读取、获取配置文件.properties中的数据,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Maven pom.xml文件获取当前时间戳方式

    Maven pom.xml文件获取当前时间戳方式

    这篇文章主要介绍了Maven pom.xml文件获取当前时间戳方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot 整合Lock4j 分布式锁深度使用案例讲解

    SpringBoot 整合Lock4j 分布式锁深度使用案例讲解

    本文介绍SpringBoot分布式锁框架Lock4j,支持Redis、Zookeeper等多种存储实现,通过注解和AOP简化锁管理,提供并发控制、防止重复提交等场景应用,并支持自定义执行器和key生成策略,适用于高并发和异构系统需求,感兴趣的朋友一起看看吧
    2025-07-07

最新评论