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