消息持久化
更新時間 2024-09-11 15:36:24
最近更新時間: 2024-09-11 15:36:24
分享文章
本章節主要介紹分布式消息服務RabbitMQ的消息持久化。
使用場景
默認情況下,RabbitMQ生產者生產的消息存儲在內存中,當節點宕機或重啟時,如何確保消息不丟失呢?RabbitMQ通過持久化機制實現,持久化包括Exchange持久化、Queue持久化和Message持久化。 持久化是將內存中的消息寫入到磁盤中,以防異常情況導致內存中的消息丟失。但是磁盤的讀寫速度遠不如內存,開啟消息持久化后,RabbitMQ的性能會下降。 與惰性隊列不同,持久化消息會在磁盤和內存中各存儲一份,只有在內存空間不夠時,才會將內存中的消息刪除,存儲到磁盤中。
說明
非持久化Queue、Exchange在重啟之后會丟失。
非持久化Message在重啟之后會丟失(經過持久化Queue/Exchange的消息不會自動變為持久化消息)。
持久化消息在尚未完成持久化時,如果服務器重啟,消息會丟失。
設置Exchange持久化
在RabbitMQ WebUI頁面創建Exchange時,設置“durable”為“true”,如圖1所示,設置成功后如圖2所示。
圖1 設置Exchange持久化


圖2 持久化的Exchange


設置Queue持久化
在RabbitMQ WebUI頁面創建Queue時,設置“durable”為“true”,如圖3所示,設置成功后如圖4所示。
圖3 設置Queue持久化


圖4 持久化的Queue


設置Message持久化
Queue設置為持久化后,通過設置“MessageProperties”為“PERSISTENT_TEXT_PLAIN”來向Queue發送持久消息。
以下示例演示在Java客戶端設置Message持久化
import com.rabbitmq.client.MessageProperties;
channel.basicPublish("", "my_queue",MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());