目錄
MQ的可靠性
1.如何設置數據持久化
1.1.交換機持久化
1.2.隊列持久化
1.3.消息持久化
2.消息持久化
隊列持久化:
消息持久化:
3.非消息持久化
非持久化隊列:
非持久化消息:
4.消息的存儲機制
4.1持久化消息(Persistent Messages)
4.2非持久化消息(Transient Messages)
4.3關鍵區別
4.4總結
之前的文章我們介紹了RabbitMQ的發送者的可靠性,接下來我來向大家講解MQ的可靠性
發送者的可靠性文章
MQ的可靠性
消息到達MQ以后,如果MQ不能及時保存,也會導致消息丟失,所以MQ的可靠性也非常重要。
1.如何設置數據持久化
為了提升性能,默認情況下MQ的數據都是在內存存儲的臨時數據,重啟后就會消失。為了保證數據的可靠性,必須配置數據持久化,包括:
-
交換機持久化
-
隊列持久化
-
消息持久化
我們以控制臺界面為例來說明。
持久化:數據存儲在磁盤,服務宕機了,數據也不會丟失。
非持久化:數據存儲在內存,服務宕機了,數據也就不在了
1.1.交換機持久化
在控制臺的Exchanges
頁面,添加交換機時可以配置交換機的Durability
參數:
設置為Durable
就是持久化模式,Transient
就是臨時模式。
1.2.隊列持久化
在控制臺的Queues頁面,添加隊列時,同樣可以配置隊列的Durability
參數:
1.3.消息持久化
在控制臺發送消息的時候,可以添加很多參數,而消息的持久化是要配置一個properties
:
Non-persistent:消息非持久化 Persistent:消息持久化
2.消息持久化
消息持久化是為了確保即使 RabbitMQ 服務重啟或崩潰,消息也不會丟失。它主要包括以下幾個步驟:
-
隊列持久化:
-
當創建隊列時,如果指定了隊列的持久化屬性(durable=true),那么該隊列會被寫入磁盤。即使 RabbitMQ 服務重啟,該隊列仍然存在。
-
但如果隊列中沒有消息或消息沒有被持久化,隊列重啟后將是空的。
-
-
消息持久化:
-
當發送消息時,如果指定了消息的持久化屬性(delivery_mode=2),那么消息會被寫入磁盤。即使 RabbitMQ 服務重啟,消息仍然存在,直到被消費者消費。
-
消息的持久化和隊列的持久化需要同時設置,否則消息仍然可能丟失。例如,如果隊列沒有設置持久化,即使消息設置了持久化,隊列在重啟后也會消失,消息也就隨之丟失。
-
3.非消息持久化
非持久化消息主要用于某些場景下,如消息的可靠性要求不高,或者需要快速傳輸大量消息。它主要包括以下幾個步驟:
-
非持久化隊列:
- 當創建隊列時,如果沒有指定隊列的持久化屬性(durable=false),那么該隊列不會被寫入磁盤。如果 RabbitMQ 服務重啟,該隊列將消失。
-
非持久化消息:
- 當發送消息時,如果沒有指定消息的持久化屬性(delivery_mode=1),那么消息不會被寫入磁盤。如果 RabbitMQ 服務重啟,消息將丟失。
4.消息的存儲機制
4.1持久化消息(Persistent Messages)
-
In Memory:持久化消息會被緩存在內存中,以便快速處理。
-
Persistent:這些消息同時也會被寫入磁盤進行持久化存儲。即使RabbitMQ服務重啟,持久化消息也不會丟失,因為它們在磁盤上有副本。
4.2非持久化消息(Transient Messages)
-
In Memory:非持久化消息同樣會被緩存在內存中。
-
Paged Out:當內存資源緊張時,RabbitMQ會將部分非持久化消息從內存換出到磁盤。這些消息被換出到磁盤后,如果內存壓力減輕,可能會被換回內存。但與持久化消息不同的是,非持久化消息在磁盤上沒有持久化副本,因此在RabbitMQ服務重啟時,這些消息不會被恢復。
4.3關鍵區別
-
持久化消息:內存中的數據是緩存,同時在磁盤上有持久化副本,以確保數據不會丟失。
-
非持久化消息:內存中的數據是主要存儲位置,磁盤上的數據只是在內存壓力下的一種臨時存儲方式,并不用于持久化。
4.4總結
-
持久化消息:內存和磁盤上都有數據,磁盤上的數據用于持久化。
-
非持久化消息:內存和磁盤上都有數據,但磁盤上的數據只是臨時的,不用于持久化。