我想知道RabbitMQ如何将消息物理地存储在其RAM和磁盘中?
我知道RabbitMQ试图将消息保存在内存中(但我不知道消息是如何放入Ram的)。但是当消息处于持久模式或代理具有内存压力时,消息可能会溢出到磁盘中。 (但我不知道消息是如何存储在磁盘中的。)
我想知道关于这些内幕的内容。不幸的是,其主页上的官方文档没有公开内部细节。
我应该阅读哪个文件?
答案 0 :(得分:16)
RabbitMQ使用自定义DB来存储消息,db通常位于此处:
/var/lib/rabbitmq/mnesia/rabbit@hostname/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.html 和 https://www.rabbitmq.com/blog/2015/12/28/whats-new-in-rabbitmq-3-6-0/
延迟队列这种新类型的队列通过发送每条消息来工作 直接传递给文件系统,只加载 消费者到达队列时RAM中的消息。优化磁盘 读取消息是批量加载的。