配置RabbitMQ持久化
默认情况下,RabbitMQ生产者生产的消息存储在内存中,当节点宕机或重启时,会导致消息丢失。RabbitMQ提供持久化机制,可在节点宕机或重启时确保消息不丢失。持久化包括Exchange持久化、Queue持久化和Message持久化。
持久化是将内存中的消息写入到磁盘中,以防异常情况导致内存中的消息丢失。但是磁盘的读写速度远不如内存,开启消息持久化后,RabbitMQ的性能会下降。与惰性队列不同,持久化消息会在磁盘和内存中各存储一份,只有在内存空间不够时,才会将内存中的消息删除,存储到磁盘中。
约束与限制
- 非持久化的Queue、Exchange在重启之后会丢失。
- 非持久化的Message在重启之后会丢失(经过持久化Queue/Exchange的消息不会自动变为持久化消息)。
- 持久化消息在尚未完成持久化时,如果服务器重启,消息会丢失。
- RabbitMQ AMQP-0-9-1版本Exchange、Queue、Message默认开启持久化。
设置Exchange持久化
您可以在WebUI或RabbitMQ控制台设置Exchange持久化。
- 登录RabbitMQ实例的Web UI。
- 在菜单栏,选择“Exchanges”。
- 创建一个Exchange,并将“durable”设置为“true”,如图1所示。
表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持久化。
- 在Exchange列表中,将鼠标放在新创建Exchange的“Args”上,如图2所示,如果显示“durable: true”,表示配置Exchange持久化成功。
- 参考创建RabbitMQ Exchange创建Exchange,并设置Exchange持久化,如图3所示。
- 在Exchange列表中,查看新创建Exchange是否已开启持久化。如果“持久化”显示“是”,表示开启成功,如图4所示。
- 登录RabbitMQ实例的Web UI。
- 在菜单栏,选择“Exchanges”。
- 创建一个Exchange,并将“durable”设置为“true”,如图1所示。
表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持久化。
- 在Exchange列表中,将鼠标放在新创建Exchange的“Args”上,如图2所示,如果显示“durable: true”,表示配置Exchange持久化成功。
- 参考创建RabbitMQ Exchange创建Exchange,并设置Exchange持久化,如图3所示。
- 在Exchange列表中,查看新创建Exchange是否已开启持久化。如果“持久化”显示“是”,表示开启成功,如图4所示。
设置Queue持久化
您可以在WebUI或RabbitMQ控制台设置Queue持久化。
- 登录RabbitMQ实例的Web UI。
- 在菜单栏,选择“Queues”。
- 创建一个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属性。无需设置。
- 单击“Add queue”,完成持久化队列的创建。
- 在“Queues”页面查看新创建的Queue是否为持久化Queue。“Features”显示“D”时,表示此Queue为持久化Queue。
图6 查看Queue属性
- 参考创建RabbitMQ Queue创建Queue,并设置Queue持久化,如图7所示。
- 在Queue列表中,查看新创建Queue是否已开启持久化。如果“持久化”显示“是”,表示开启成功,如图8所示。
- 登录RabbitMQ实例的Web UI。
- 在菜单栏,选择“Queues”。
- 创建一个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属性。无需设置。
- 单击“Add queue”,完成持久化队列的创建。
- 在“Queues”页面查看新创建的Queue是否为持久化Queue。“Features”显示“D”时,表示此Queue为持久化Queue。
图6 查看Queue属性
- 参考创建RabbitMQ Queue创建Queue,并设置Queue持久化,如图7所示。
- 在Queue列表中,查看新创建Queue是否已开启持久化。如果“持久化”显示“是”,表示开启成功,如图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());