如何保证消息的可靠性,避免消息丢失

简介: 如何保证消息的可靠性,避免消息丢失

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

(1)生产者把消息发送到 RabbitMQ Server 的过程中丢失

(2)RabbitMQ Server 收到消息后再持久化之前宕机导致消息 丢失

(3)消费端收到消息还没来得及处理,此时宕机,导致 RabbitMQ Server 认为这个消息已签收,无法重复投递导致消息丢失

 

所以我认为保证消息可靠性从 生产者、MQ、消费者中这三个方面着手就可以了

解决方案:

 

从生产者发送消息到 Server 端的角度:RabbitMQ 提供了事务(transaction)和确认(confirm)两种模式来确保生产者不丢消息。

(1)开启事务 channel.txSelect (),然后发送消息,如果发送过程中出现什么异常,事务就会回滚 channel.txRollback (),如果发送成功则提交事务 channel.txCommit (),但是这种方式是同步的,会导致吞吐量下降;

(2)confirm 确认模式:RabbitMQ 提供了一个 Confirm 消息确认机制,消息从生产者发送到 Server 端以后,如果消息处理成功,Server 端会返回一个 ack 的消息,那么客户端可以根据消息的处理结果,来决定是否要对消息进行重新发送,从而确保消息发送到 Server 端上。

 

从 RabbitMQ Server 端的角度:可以开启消息的持久化机制,也就是收到消息之后持久化到磁盘里面。设置持久化的方式有两个步骤:

(1)创建 Queue 的时候设置为持久化

(2)发送消息的时候,把消息投递模式设置为持久化投递。

 

不过虽然设置了持久化消息,但是有可能也会出现问题,比如消息刷新到磁盘之前,RabbitMQ 的 Server 端宕机,导致消息丢失的一个问题。所以为了确保万无一失,我们需要结合 Confirm 消息确认机制来一起使用。

 

从消费端的角度:我们可以把消息的自动确认机制修改为手动确认,也就是消费端只有手动调用消息确认方法,才表示这个消息已经被签收。

这种方式可能会造成消息的重复消费的问题,这里需要考虑到幂等性的一个设计。

 

以上就是我对保证消息的可靠性的全部理解。

 

image.png


  • 生产者提交给消息服务器时,使用确认机制
  • 消息服务器对应的队列、交换机等都持久化,保证数据的不丢失
  • 消费者关闭 RabbitMQ 自动 ACK,采用消息确认机制,保证数据的不丢失
相关实践学习
消息队列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
相关文章
|
7月前
|
消息中间件 存储 运维
|
6天前
|
消息中间件 Java 中间件
MQ四兄弟:如何保证消息可靠性
本文介绍了RabbitMQ、RocketMQ、Kafka和Pulsar四种消息中间件的可靠性机制。这些中间件通过以下几种方式确保消息的可靠传输:1. 消息持久化,确保消息在重启后不会丢失;2. 确认机制,保证消息从生产者到消费者都被成功处理;3. 重试机制,处理失败后的重试;4. 死信队列,处理无法消费的消息。每种中间件的具体实现略有不同,但核心思想相似,都是从生产者、中间件本身和消费者三个角度来保障消息的可靠性。
14 0
|
消息中间件 存储 Kafka
如何保证MQ中消息的可靠性传输?
如何保证MQ中消息的可靠性传输?
121 1
|
7月前
|
消息中间件 存储 负载均衡
【mq】如何保证消息可靠性
【mq】如何保证消息可靠性
156 0
|
7月前
|
消息中间件 存储 程序员
RabbitMQ消息丢失的场景,如何保证消息不丢失?(详细讲解,一文看懂)
RabbitMQ消息丢失的场景,如何保证消息不丢失?(详细讲解,一文看懂)
344 0
RabbitMQ消息丢失的场景,如何保证消息不丢失?(详细讲解,一文看懂)
|
7月前
|
消息中间件 存储 Java
MQ怎么确保消息不丢失
MQ怎么确保消息不丢失
|
消息中间件 存储 Kafka
MQ 学习日志(六) 保证消息的可靠性传输
消息的可靠性传输 简述
122 0
|
消息中间件 Kafka 测试技术
MQ 学习日志(七) 保证消息消费的顺序性
保证消息消费的顺序性
190 0
|
消息中间件 存储 NoSQL
EMQ如何保证消息不丢失?
EMQ 通过以下方式来保证消息不丢失
658 0
|
消息中间件 存储 缓存
该如何保证消息的可靠性传输
该如何保证消息的可靠性传输
141 0