> rabbitmq持久化分为:交换机持久化、队列持久化、数据持久化
> 在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。当然还是会有一些小概率事件会导致消息丢失。
# 1.交换机持久化
交换机的持久化其实就是相当于将交换机的属性在服务器内部保存,当MQ的服务器发生意外或关闭之后,重启RabbitMQ时不需要重新手动或执行代码去建立交换机,交换机会自动建立,相当于一直存在。
创建交换机的方法为`exchange_declare($exhcange_name,$type,$passive,$durable,$auto_delete);`,当$durable这个参数为true时,该交换机就会被存储到内存里,当RabbitMQ服务器重启时,会将该交换机自动重新创建,如果为false,重启后该交换机则会被从交换机队列里删掉。
![](https://img.kancloud.cn/7c/53/7c534877d82978ebd17b9faa08095f06_1005x462.png)
# **2、队列持久化**
队列持久化类似于交换机持久化,创建队列方法queue_declare中也有一个参数是$durable,也代表着RabbitMQ服务器重启时,是否自动创建队列,图中参数注释与方法中的参数(除队列名外)顺序一一对应
![](https://img.kancloud.cn/d2/bd/d2bd5cf9098179436f5017631ff2c5e6_1217x125.png)
队列的属性
![](https://img.kancloud.cn/55/e7/55e7d4bcd792b3d7834eb147ea96dbfc_1004x439.png)
**3、消息持久化**
> RabbitMQ的消息是依附于队列存在的,**所以想要消息持久化,那么前提是队列也要持久化**。
> 消息做持久化,只需要将消息属性的delivery-mode设置为2即可,消息在被消费之前会被持久化到磁盘,即使服务重启消息也不会丢失(会有丢失的小概率)
> 消息持久化有磁盘io会影响性能,非关键数据可以不用开启持久化
![](https://img.kancloud.cn/2e/ea/2eea1e1911ff4eca4274b65f831168cc_1004x788.png)
arguments中可以设置的队列的常⻅参数如下
![](https://img.kancloud.cn/31/63/316310e16e66d5b3d5bfa76513bc2417_1011x508.png)
消息的持久化与交换机持久化与队列持久化有所不同,消息的持久化在于创建消息的时候,加一个持久化消息的属性,创建消息的方法是new AMQPMessage($data,$properties),其中$properties是个数组,里面可以设置对消息的各种属性,如持久化,优先级等属性。持久化的key值为"delivery_mode",当"delivery_mode"为1时表示消息不持久化,为2时则表示消息持久化,且**把消息存在磁盘里**
![](https://img.kancloud.cn/b1/9d/b19dad6be1d7715e0f4c1760df985d0b_961x87.png)
你也注意到了客户端的参数配置从某种程度上讲也是方便你的IDE易于搜索。$client 对象下的所有核心方法(索引,搜索,获取等)都是可用的。索引管理和集群管理分别在`$client->indices()`和`$client->cluster()`中。