【发布时间】:2019-04-02 02:34:37
【问题描述】:
我想知道 RabbitMQ 如何将消息物理存储在其 RAM 和磁盘中?
我知道 RabbitMQ 试图将消息保存在内存中(但我不知道消息是如何放入 Ram 中的)。但是当消息处于持久模式或代理有内存压力时,消息可能会溢出到磁盘中。 (但我不知道消息是如何存储在磁盘中的。)
我想了解这些的内部情况。不幸的是,其主页上的官方文档并没有公开内部细节。
我应该为此阅读哪个文件?
【问题讨论】:
标签: rabbitmq
我想知道 RabbitMQ 如何将消息物理存储在其 RAM 和磁盘中?
我知道 RabbitMQ 试图将消息保存在内存中(但我不知道消息是如何放入 Ram 中的)。但是当消息处于持久模式或代理有内存压力时,消息可能会溢出到磁盘中。 (但我不知道消息是如何存储在磁盘中的。)
我想了解这些的内部情况。不幸的是,其主页上的官方文档并没有公开内部细节。
我应该为此阅读哪个文件?
【问题讨论】:
标签: rabbitmq
RabbitMQ 使用自定义 DB 来存储消息,该 db 通常位于此处:
/var/lib/rabbitmq/mnesia/rabbit@hostname/queues
从 RabbitMQ 3.5.5 版本开始引入了新的新信用流 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.html 和 https://www.rabbitmq.com/blog/2015/12/28/whats-new-in-rabbitmq-3-6-0/
惰性队列 这种新型队列的工作原理是发送每一条消息 直接传递给他们的文件系统,并且只加载 当消费者到达队列时,RAM 中的消息。优化磁盘 读取消息是分批加载的。
【讨论】: