前一篇文章介绍了发送者的可靠性,保证的是消息可以成功的发送到 MQ,我们这篇文章主要介绍消息到了 MQ 之后,怎么保证消息不丢失。
在默认情况下,RabbitMQ 会将接收到的消息保存在内存中以降低消息收发的延迟。这样会导致两个问题:
- 一旦 MQ 宕机,内存中的消息会丢失
- 内存空间有限,当服务者故障或处理过慢时,会导致消息积压,引发 MQ 阻塞。
要解决上面所说的问题,可以通过以下的几个方法:
数据持久化
RabbitMQ 实现数据持久化包括三个方面:
- 交换机持久化
创建交换机的时候可以选择一个 Durability 属性:
- Durable: 持久的,重启服务依然存在
- Transient: 临时的,重启服务会消失
2. 队列持久化
和上面的交换机是一样的,只不过持久化的对象变成了队列

- 消息持久化
消息持久化,需要设置一个参数 delivery_mode = 2
SpringAMQP 发送的消息默认是持久化的
Lazy Queue
从 RabbitMQ 的 3.6.0 版本开始,就增加了 Lazy Queue 的概念,也就是惰性队列 惰性队列的特征如下:
- 收到消息后直接存入磁盘而非内存(内存中只保留最近的消息,默认2048条)
- 消费者要消费消息时才会从磁盘中读取并加载到内存
- 支持百万条消息存储
在3.12版本后,所有的队列都是 Lazy Queue 模式,无法更改。
总结
RabbitMQ 如何保证消息的可靠性
- 首先通过配置可以让交换机、队列、以及发送的消息都持久化。这样队列中的消息会持久化到磁盘,MQ 重启消息依然存在。
- RabbitMQ 在 3.6 版本引入了 LazyQueue ,并且在 3.12 版本后成为队列的默认模式。LazyQueue 会将所有消息持久化。
- 开启持久化和生产者确认时,RabbitMQ 只有在消息持久化完成后才会给生产者返回 ACK 回执。