使用场景
默认情况下,RabbitMQ生产者生产的消息存储在内存中,当节点宕机或重启时,如何确保消息不丢失呢?RabbitMQ通过持久化机制实现,持久化包括Exchange持久化、Queue持久化和Message持久化。持久化是将内存中的消息写入到磁盘中,以防异常情况导致内存中的消息丢失。但是磁盘的读写速度远不如内存,开启消息持久化后,RabbitMQ的性能会下降。与惰性队列不同,持久化消息会在磁盘和内存中各存储一份,只有在内存空间不够时,才会将内存中的消息删除,存储到磁盘中。
说明
非持久化队列、Exchange在重启之后会丢失。
非持久化消息在重启之后会丢失(经过持久化队列/Exchange的消息不会自动变为持久化消息)。
持久化消息在尚未完成持久化时,如果服务器重启,消息会丢失。
设置Exchange持久化
在RabbitMQ的Web界面创建Exchange时,设置“durable”为“true”,如图1所示,设置成功后如图2所示。
图1 设置Exchange持久化
图2 持久化的Exchange
设置Queue持久化
在RabbitMQ的Web界面创建Queue时,设置“durable”为“true”,如图3所示,设置成功后如图4所示。
图3 设置Queue持久化
图4 持久化的Queue
设置Message持久化
Queue设置为持久化后,通过设置“MessageProperties”为“PERSISTENT_TEXT_PLAIN”来向Queue发送持久消息。
以下示例演示在Java客户端设置Message持久化
import com.rabbitmq.client.MessageProperties;
channel.basicPublish("", "my_queue",MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());