【问题标题】:How does RabbitMQ actually store the message physically?RabbitMQ 实际是如何物理存储消息的?
【发布时间】:2019-04-02 02:34:37
【问题描述】:

我想知道 RabbitMQ 如何将消息物理存储在其 RAM 和磁盘中?

我知道 RabbitMQ 试图将消息保存在内存中(但我不知道消息是如何放入 Ram 中的)。但是当消息处于持久模式或代理有内存压力时,消息可能会溢出到磁盘中。 (但我不知道消息是如何存储在磁盘中的。)

我想了解这些的内部情况。不幸的是,其主页上的官方文档并没有公开内部细节。

我应该为此阅读哪个文件?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    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.htmlhttps://www.rabbitmq.com/blog/2015/12/28/whats-new-in-rabbitmq-3-6-0/

    惰性队列 这种新型队列的工作原理是发送每一条消息 直接传递给他们的文件系统,并且只加载 当消费者到达队列时,RAM 中的消息。优化磁盘 读取消息是分批加载的。

    【讨论】:

    • 是否可以使用 MSMQ 代替持久化消息?
    • @Marco 你的意思是“微软消息队列”吗?一般来说(现在)RabbitMQ 不支持外部数据库来存储消息
    • 是的,这就是我的意思,很公平,我不确定它是否会支持它。谢谢@Gabriele
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多