# 配置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 WebUI设置Exchange持久化]
  1. 登录[RabbitMQ实例的Web UI](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq-ug-180801003.html)。
  
  2. 在菜单栏，选择"Exchanges"。
  
  3. 创建一个Exchange，并将"durable"设置为"true"，如[图1]所示。
     
     图1设置Exchange持久化（WebUI）   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002334896206.png "点击放大")
     表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不能用于生产消费消息。  - No：该Exchange可以用于生产消费消息。                                                                                                                                                                                                                                                                                                                                                                                                          |
     | Arguments | 通过"**durable=true**"，配置Exchange持久化。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
        
     
     
  
  4. 在Exchange列表中，将鼠标放在新创建Exchange的"Args"上，如[图2]所示，如果悬浮窗显示"durable: true"，表示配置Exchange持久化成功。
     
     图2持久化的Exchange（WebUI）   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002368899797.png "点击放大")
     
     
   
- [在RabbitMQ控制台设置Exchange持久化]
  1. 参考[创建RabbitMQ Exchange](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq_ug_0027.html)创建Exchange，并设置Exchange持久化，如[图3]所示。
     
     图3设置Exchange持久化（控制台）   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002523780857.png "点击放大")
     
     
  
  2. 在Exchange列表中，查看新创建Exchange是否已开启持久化。如果"持久化"显示"是"，表示开启成功，如[图4]所示。
     
     图4持久化的Exchange（控制台）   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002491823536.png "点击放大")
     
     
   
#### 设置Queue持久化
您可以在WebUI或RabbitMQ控制台设置Queue持久化。
- [在RabbitMQ WebUI设置Queue持久化]
  1. 登录[RabbitMQ实例的Web UI](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq-ug-180801003.html)。
  
  2. 在菜单栏，选择"Queues"。
  
  3. 创建一个Queue，并设置"Durability"为"Durable"。 
     图5创建Queues   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002334925458.png "点击放大")
     表2Queue参数说明 
     | 参数名称             | 说明                                                                                                                                                                                                                                                                                                |
     |:---|:---|
     | 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属性   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002334929266.png "点击放大")
     
     
   
- [在RabbitMQ实例控制台设置Queue持久化]
  1. 参考[创建RabbitMQ Queue](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq_ug_0029.html)创建Queue，并设置Queue持久化，如[图7]所示。
     
     图7设置Queue持久化（控制台）   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002523784263.png "点击放大")
     
     
  
  2. 在Queue列表中，查看新创建Queue是否已开启持久化。如果"持久化"显示"是"，表示开启成功，如[图8]所示。
     
     图8持久化的Queue（控制台）   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002334934224.png "点击放大")
     
     
   
#### 设置Message持久化
Queue设置为持久化后，可通过客户端设置"**MessageProperties** "为"**PERSISTENT_TEXT_PLAIN**"，向Queue发送持久消息。
以下示例演示在Java客户端设置Message持久化：
```
import com.rabbitmq.client.MessageProperties;
channel.basicPublish("", "my_queue",MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
```
