RabbitMQ消息丢失怎么办

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: RabbitMQ消息丢失怎么办

消息丢失怎么办

可能出现消息丢失的三种情况:

  • 生产者发送消息到RabbitMQ服务器后,RabbitMQ服务器出现宕机(生产者发送成功,mq宕机)
  • RabbitMQ服务器出现类似脑裂问题后重启服务()
  • 消费者接收到MQ消息后出现宕机或者业务处理异常(接收者接收到消息之后宕机/业务异常)

应对以上三种情况,有以下对应的解决方法:

生产者confirm模式

针对生产者发送消息后MQ宕机问题,生产者开启事务消息可以保证消息到达MQ服务器。经过测试开启事务消息会降低2~10倍的吞吐量,而且会使生产者和应用程序产生同步。

所以,RabbitMQ团队有更好的方案来保证消息投递:发送方确认模式。当然你需要告诉Rabbit将信道设置成confirm模式


消息持久化

MQ服务器出现类似脑裂问题后重启服务器导致消息对视问题,如果MQ重启后,队列和交换机都会消失(随同里面的消息)。原因是因为每个队列和交换机默认的durable默认方式是false,确定了交换机和队列需要重新建立,我们将值设置为true就不会出现重新建立交换机和队列的情况,但是消息还是会消失。但是可以从奔溃的MQ中恢复的消息我们称为消息的持久化。只需将要投递的消息标记为持久化。RMQ的持久化,是不承诺100%消息不丢失的。


消息者补偿机制

MQ发送消息后消费者宕机或者消费者处理消息时出现异常的场景。消息丢失取决于消费者端是手动ack还是自动ack,如果业务量不大的情况可以使用手动ack,这样MQ就不会发送完消息之后马上删除消息,需要消费者确定消息处理完成之后才删除消息。如果业务量大的情况下使用手动ack会影响系统的吞吐量,可以出现消息积压现象。因此业务量大的话我们会选择自动ack,如何保证消息步丢失呢?

我们做了一下消息补偿机制:

其中的ES可以替换为其他非关系型数据库,MangoDB,Redis...

生产者发送消息

1.1 生产者发送消息到RabbitMQ服务器

1.2 RabbitMQ通过异步confirm方式通知生产者消息接收完成

1.3 生产者可以异步将消息存入ES(备份消息),防止MQ服务器重启导致消息丢失,当然交换机、队列和消息现在是持久化状态

消费者消费消息

2.1 消费者接收数据

2.2 接收到消息首先写入ES

2.3 业务处理完成后删除ES中备份的消息

补发定时任务

3 定时任务补发消费失败消息并更新补发次数

报警定时任务

4 定时任务抓取补发超过3次消息邮件报警人工干预

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
6月前
|
消息中间件 存储 缓存
RabbitMQ之消息应答和持久化
【1月更文挑战第11天】 一、消息应答 1.概念 2.自动应答 3.消息应答方法 4.Multiple 的解释 5.消息自动重新入队 6.消息手动应答代码 7.手动应答效果演示 二、RabbitMQ持久化 1.概念 2.队列如何实现持久化 3.消息实现持久化 4.不公平分发 5.预取值
291 7
|
消息中间件 NoSQL Java
【RabbitMQ】RabbitMQ如何做到保证消息100%不丢失?
【RabbitMQ】RabbitMQ如何做到保证消息100%不丢失?
432 0
|
3月前
|
消息中间件 Java 开发者
如何避免RabbitMQ消息丢失?
本文探讨了RabbitMQ中如何避免消息丢失的问题。在默认情况下,RabbitMQ并不保证消息的持久性,但提供了多种机制来确保消息的可靠传输与处理。文章分析了消息可能丢失的关键环节,并介绍了相应的保证机制:发布者确认交换机已接收消息、确认队列接收消息、队列及消息的持久化,以及消费者成功处理消息后的确认。通过Java代码示例展示了如何在实际应用中实现这些机制。最终,确保了消息在从生产到消费的整个流程中的可靠性。
|
6月前
|
消息中间件 Java
RabbitMQ中的消息确认机制是什么?为什么需要消息确认?
RabbitMQ中的消息确认机制是什么?为什么需要消息确认?
93 0
|
6月前
|
消息中间件 存储 程序员
RabbitMQ消息丢失的场景,如何保证消息不丢失?(详细讲解,一文看懂)
RabbitMQ消息丢失的场景,如何保证消息不丢失?(详细讲解,一文看懂)
320 0
RabbitMQ消息丢失的场景,如何保证消息不丢失?(详细讲解,一文看懂)
|
6月前
|
消息中间件 Shell 数据库
RabbitMQ之延迟消息
RabbitMQ之延迟消息
111 0
|
6月前
|
消息中间件 存储 程序员
四、RabbitMQ如何保证消息丢失
四、RabbitMQ如何保证消息丢失
65 0
|
消息中间件
rabbitmq重复确认导致消息丢失
rabbitmq重复确认导致消息丢失
|
消息中间件 存储 运维
优雅地处理RabbitMQ中的消息丢失
优雅地处理RabbitMQ中的消息丢失
|
Java Spring
RabbitMQ-如何保证消息不丢失
RabbitMQ-如何保证消息不丢失
94 0