更新时间:2025-07-31 GMT+08:00

配置RabbitMQ持久化

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

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

约束与限制

  • 非持久化的Queue、Exchange在重启之后会丢失。
  • 非持久化的Message在重启之后会丢失(经过持久化Queue/Exchange的消息不会自动变为持久化消息)。
  • 持久化消息在尚未完成持久化时,如果服务器重启,消息会丢失。
  • RabbitMQ AMQP-0-9-1版本Exchange、Queue、Message默认开启持久化。

设置Exchange持久化

您可以在WebUI或RabbitMQ控制台设置Exchange持久化。

  1. 登录RabbitMQ实例的Web UI
  2. 在菜单栏,选择“Exchanges”。
  3. 创建一个Exchange,并将“durable”设置为“true”,如图1所示。

    图1 设置Exchange持久化(WebUI)
    表1 创建Exchange参数说明

    参数名称

    说明

    Name

    Exchange名称,用户自定义。

    Type

    Exchange类型。

    在下拉框中选择。

    • direct:该类型Exchange会将消息路由到Routing Key完全匹配的Queue中。
    • fanout:该类型Exchange会将消息路由到所有与其绑定的Queue中。
    • topic:该类型Exchange将Routing Key进行通配符匹配,然后将消息路由到匹配成功的Queue中。
    • headers:该类型Exchange与Routing Key无关,而与消息中的Headers属性信息相关。Exchange根据消息中的Headers属性键值对和绑定的属性键值对进行匹配,根据匹配情况路由消息。

    Durability

    是否开启持久化。

    • Durable:该Exchange在服务器重启后仍然存在。
    • Transient:该Exchange在服务器重启后会被删除,需要重新创建。

    Auto delete

    是否开启自动删除。

    • Yes:当最后一个绑定的Queue与Exchange解除绑定后,该Exchange会被自动删除。
    • No:当最后一个绑定的Queue与Exchange解除绑定后,不会删除该Exchange。

    Internal

    Exchange是否为RabbitMQ内部使用。

    • Yes:该Exchange只能绑定其他Exchange,不能绑定Queue。
    • No:该Exchange可以绑定其他Exchange和Queue。

    Arguments

    通过“durable=true”,配置Exchange持久化。

  4. 在Exchange列表中,将鼠标放在新创建Exchange的“Args”上,如图2所示,如果悬浮窗显示“durable: true”,表示配置Exchange持久化成功。

    图2 持久化的Exchange(WebUI)

  1. 参考创建RabbitMQ Exchange创建Exchange,并设置Exchange持久化,如图3所示。

    图3 设置Exchange持久化(控制台)

  2. 在Exchange列表中,查看新创建Exchange是否已开启持久化。如果“持久化”显示“是”,表示开启成功,如图4所示。

    图4 持久化的Exchange(控制台)

设置Queue持久化

您可以在WebUI或RabbitMQ控制台设置Queue持久化。

  1. 登录RabbitMQ实例的Web UI
  2. 在菜单栏,选择“Queues”。
  3. 创建一个Queue,并设置“Durability”为“Durable”。

    图5 创建Queues
    表2 Queue参数说明

    参数名称

    说明

    Type

    队列的类型。

    Name

    单一活跃消费者队列的名称,用户自定义。

    Durability

    是否开启持久化。设置“Durability”为“Durable”

    • Durable:该Queue在服务器重启后仍然存在。
    • Transient:该Queue在服务器重启后会被删除,需要重新创建。

    Node

    单一活跃消费者队列部署的节点。

    Auto delete

    是否开启自动删除。

    • Yes:当订阅该Queue消息的最后一个消费者取消订阅后,该Queue将被自动删除。
    • No:当订阅该Queue消息的最后一个消费者取消订阅后,不会删除该Queue。

    (可选)Arguments

    Queue属性。无需设置。

  4. 单击“Add queue”,完成持久化队列的创建。
  5. 在“Queues”页面查看新创建的Queue是否为持久化Queue。“Features”显示“D”时,表示此Queue为持久化Queue。

    图6 查看Queue属性

  1. 参考创建RabbitMQ Queue创建Queue,并设置Queue持久化,如图7所示。

    图7 设置Queue持久化(控制台)

  2. 在Queue列表中,查看新创建Queue是否已开启持久化。如果“持久化”显示“是”,表示开启成功,如图8所示。

    图8 持久化的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());