> rabbitmq持久化分為:交換機持久化、隊列持久化、數據持久化
> 在RabbitMQ服務重啟的情況下,也不會丟失消息,我們可以將Queue與Message都設置為可持久化的(durable),這樣可以保證絕大部分情況下我們的RabbitMQ消息不會丟失。當然還是會有一些小概率事件會導致消息丟失。
# 1.交換機持久化
交換機的持久化其實就是相當于將交換機的屬性在服務器內部保存,當MQ的服務器發生意外或關閉之后,重啟RabbitMQ時不需要重新手動或執行代碼去建立交換機,交換機會自動建立,相當于一直存在。
創建交換機的方法為`exchange_declare($exhcange_name,$type,$passive,$durable,$auto_delete);`,當$durable這個參數為true時,該交換機就會被存儲到內存里,當RabbitMQ服務器重啟時,會將該交換機自動重新創建,如果為false,重啟后該交換機則會被從交換機隊列里刪掉。

# **2、隊列持久化**
隊列持久化類似于交換機持久化,創建隊列方法queue_declare中也有一個參數是$durable,也代表著RabbitMQ服務器重啟時,是否自動創建隊列,圖中參數注釋與方法中的參數(除隊列名外)順序一一對應

隊列的屬性

**3、消息持久化**
> RabbitMQ的消息是依附于隊列存在的,**所以想要消息持久化,那么前提是隊列也要持久化**。
> 消息做持久化,只需要將消息屬性的delivery-mode設置為2即可,消息在被消費之前會被持久化到磁盤,即使服務重啟消息也不會丟失(會有丟失的小概率)
> 消息持久化有磁盤io會影響性能,非關鍵數據可以不用開啟持久化

arguments中可以設置的隊列的常?參數如下

消息的持久化與交換機持久化與隊列持久化有所不同,消息的持久化在于創建消息的時候,加一個持久化消息的屬性,創建消息的方法是new AMQPMessage($data,$properties),其中$properties是個數組,里面可以設置對消息的各種屬性,如持久化,優先級等屬性。持久化的key值為"delivery_mode",當"delivery_mode"為1時表示消息不持久化,為2時則表示消息持久化,且**把消息存在磁盤里**

你也注意到了客戶端的參數配置從某種程度上講也是方便你的IDE易于搜索。$client 對象下的所有核心方法(索引,搜索,獲取等)都是可用的。索引管理和集群管理分別在`$client->indices()`和`$client->cluster()`中。