更新时间:2024-10-29 GMT+08:00

配置RabbitMQ持久化

默认情况下,RabbitMQ生产者生产的消息存储在内存中,当节点宕机或重启时,会导致消息丢失。RabbitMQ提供持久化机制,可在节点宕机或重启时确保消息不丢失。持久化包括Exchange持久化、Queue持久化和Message持久化。

持久化是将内存中的消息写入到磁盘中,以防异常情况导致内存中的消息丢失。但是磁盘的读写速度远不如内存,开启消息持久化后,RabbitMQ的性能会下降。与惰性队列不同,持久化消息会在磁盘和内存中各存储一份,只有在内存空间不够时,才会将内存中的消息删除,存储到磁盘中。

  • 非持久化的Queue、Exchange在重启之后会丢失。
  • 非持久化的Message在重启之后会丢失(经过持久化Queue/Exchange的消息不会自动变为持久化消息)。
  • 持久化消息在尚未完成持久化时,如果服务器重启,消息会丢失。

设置Exchange持久化

  • RabbitMQ WebUI页面设置Exchange持久化。

    创建Exchange时,设置“durable”为“true”,如图1所示。

    图1 设置Exchange持久化(WebUI)

    设置成功后如图2所示。

    图2 持久化的Exchange(WebUI)
  • 在RabbitMQ实例控制台设置Exchange持久化。

    创建Exchange时,设置Exchange持久化,如所示。

    设置成功后如所示。

设置Queue持久化

  • RabbitMQ WebUI页面设置Queue持久化。

    创建Queue时,设置“durable”为“true”,如图3所示。

    图3 设置Queue持久化(WebUI)

    设置成功后如图4所示。

    图4 持久化的Queue(WebUI)
  • 在RabbitMQ实例控制台设置Queue持久化。

    创建Queue时,设置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());