RabbitMQ 默认将消息存储在内存中,一旦节点宕机或重启,这些消息就会丢失。
为了防止这种情况,RabbitMQ 提供了持久化功能,可以将消息保存到磁盘上,确保即使服务器出现问题,消息也不会丢失。持久化包括三个方面:Exchange 持久化、Queue 持久化和 Message 持久化。
开启消息持久化后,消息会同时存储在内存和磁盘上。只有当内存不足时,RabbitMQ 才会将部分消息从内存移除,仅保留在磁盘中。需要注意的是,持久化会降低 RabbitMQ 的性能,因为磁盘读写速度比内存慢得多。这与惰性队列不同,惰性队列是直接将消息写入磁盘,而不是同时在内存和磁盘中保存。
约束与限制
非持久化的 Queue、Exchange 在服务重启之后会丢失,需要重新创建。
未标记持久化的消息在服务中断后会消失,即使声明为持久化的消息,如果在写入磁盘过程中发生服务中断,仍可能丢失,只有成功持久化到磁盘的消息才能在重启后恢复。
仅开源托管版集群需要配置持久化,Serverless 版本集群默认开启持久化,无需配置。
配置 Exchange 持久化

配置 Queue 持久化

配置 Message 持久化
当 Queue 设置为持久化后,可以在客户端向 Queue 发送持久化消息。
以下为一个 Java 客户端示例,通过设置
MessageProperties
参数为PERSISTENT_TEXT_PLAIN
来实现。import com.rabbitmq.client.MessageProperties;channel.basicPublish("", "test_queue",MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());