2016-07-18 40 views
7

我想知道RabbitMQ如何將消息物理存儲在其RAM和磁盤中?RabbitMQ如何實際存儲消息?

我知道RabbitMQ試圖保留消息在內存中(但我不知道消息如何放在Ram中)。但是,當消息處於持續模式或代理具有內存壓力時,消息可能會泄漏到磁盤中。 (但我不知道這些消息是如何存儲在磁盤中的。)

我想知道這些內部消息。不幸的是,其主頁上的官方文檔並未公開內部細節。

我應該閱讀哪些文件?

回答

6

的RabbitMQ usues自定義數據庫來存儲信息,該數據庫通常設在這裏:

/var/lib/rabbitmq/mnesia/[email protected]/queues 

啓動形式的版本3.5.5的RabbitMQ推出了新的新信用流通 https://www.rabbitmq.com/blog/2015/10/06/new-credit-flow-settings-on-rabbitmq-3-5-5/

讓我們來看看RabbitMQ如何排隊存儲消息。當 消息進入隊列時,隊列需要確定是否應該保留消息 。如果消息必須被保存,那麼RabbitMQ將立即執行[3]。現在,即使消息被持久保存到磁盤,這並不意味着消息已從RAM中刪除,因爲 RabbitMQ在消息傳遞給消費者時保留RAM中的消息緩存以便快速訪問。無論何時我們正在談論將尋址信息發送到磁盤時,我們都在談論RabbitMQ在 必須將消息從此緩存發送到文件系統時的行爲。

這篇博客是足夠詳細。

我也建議閱讀有關懶惰的隊列: https://www.rabbitmq.com/lazy-queues.htmlhttps://www.rabbitmq.com/blog/2015/12/28/whats-new-in-rabbitmq-3-6-0/

懶隊列這種新型的隊列通過發送每一個消息 被交付給他們直接到文件系統的工作,當消費者到達隊列時,只在內存中加載 消息。要優化磁盤 讀取消息分批加載。

+0

請參閱此處的實際文件位置:https://www.rabbitmq.com/relocate.html – Andy

+0

並且有可能使用MSMQ來代替持久性消息嗎? – Marco

+0

@Marco的意思是「微軟消息隊列」?一般來說(現在)RabbitMQ不支持外部數據庫來存儲消息 – Gabriele