2016-07-18 41 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