【问题标题】:RabbitMQ memory management and duplicationRabbitMQ 内存管理和复制
【发布时间】:2012-10-14 05:50:42
【问题描述】:

我目前正在评估 RabbitMQ 来管理队列。我想知道 RabbitMQ 是如何管理内存中的队列项的。

在此发布者订阅者示例中 http://www.rabbitmq.com/tutorials/tutorial-three-python.html

是否为每个订阅者(消费者)创建队列?例如,如果我有两个消费者,那么我将内存使用量翻倍来存储消息?

我的印象是,如果我在一个队列上附加多个工作人员,那么它将成为一个工作队列,每个消费者都会收到不同的消息。

假设我正在为此构建聊天服务器。我需要为每个消费者创建一个队列吗?并且内存中的每条消息都会乘以连接的用户数?还是内存中只有一条消息,每个队列都有指向该消息的指针。

同样在主题消息的示例中。 http://www.rabbitmq.com/tutorials/tutorial-five-python.html

假设我有 1kb 的消息。那么2个队列有2kb的内存使用吗? Q1、Q2 和说消息匹配所有的绑定键。

如果我添加另一个队列来收听,让 lazy.blue.* 作为 Q3。这会在内存中创建一个新的队列项吗?并复制数据?

【问题讨论】:

    标签: memory-management erlang queue rabbitmq message-queue


    【解决方案1】:

    我不是 rabbitmq 黑客,但常识说每个队列都应该有一个指向一个唯一消息实例的指针。

    【讨论】:

      【解决方案2】:

      在第一个示例中,您有一个发布者将消息发送到特定的交换,并且该交换绑定到两个队列。

      关于为每个消费者创建一个队列(我假设这就是您所说的“订阅者”的意思),这完全取决于您。在第一个图中,没有显示消费者,但您可以配置消费者来侦听这些队列中的一个或两者上的消息。队列(不是消费者)会影响你的记忆;相比之下,交换在内存成本方面很便宜。

      对于第二张图,是的,创建第三个队列“Q3”将在内存中创建一个新队列。我对你的最后一个问题有点困惑,你似乎在问如果交换发送一条匹配所有绑定模式的消息会发生什么?如果这发生在此处,则消息将简单地发送到所有三个队列。主题类型的交换(如示例中的交换设置)只是将消息路由到绑定键与消息的路由键匹配的所有队列。

      【讨论】:

      • 我必须修复第一张图片。我的印象是,如果您在单个队列中附加多个消费者,每个消费者将获得不同的数据。因为我希望每个消费者都收到相同的数据,所以我必须为每个消费者创建单独的队列。真的吗 ?每个新的消费者都会将存储在内存中的消息加倍。我知道消息将被发送到 3 队列。但我想知道这样做的后果。那条消息会在内存中重复 3 次吗?还是只存储一次,每个队列都有一个指向该消息的指针?
      • 如果您有多个消费者,那么对于一个队列,他们将各自收到不同的消息。如果您希望每个消费者获得相同的消息,那么您需要每个消费者一个队列和一个将消息转发到每个队列的交换器。
      • 我想你可能误解了 mq.是的,理论上每个队列都会有更多的内存使用。但关键是每条消息都被快速消耗掉。如果队列中没有太多消息,Rabbit mq 效果最好。
      • 感谢@robthewolf,我真正理解队列的目的不是在内存上存储一些数据。但随着对 RabbitMQ 工作原理的了解,可以在设计架构时做出明智的决定。
      【解决方案3】:

      发件人:http://www.rabbitmq.com/blog/2011/01/20/rabbitmq-backing-stores-databases-and-disks/

      如果 Rabbit 需要节省内存并写入磁盘,则只保存一条消息。

      “队列自己决定何时以及是否将消息写入磁盘。但是单个消息可以发送到多个队列,确保每条消息只写入磁盘一次显然是有利的。但是,有两个不同的这里的信息:首先,消息内容本身。这在消息发送到的每个队列中都是相同的,并且应该只写入一次磁盘,无论它进入多少个队列;注意后续写入其中不需要进行值比较:如果后备存储知道消息的 ID,则消息正文将匹配磁盘上已有的内容——消息内容永远不会被代理更改。第二条信息是每个队列中是否存在消息:它在队列中的位置,它的邻居是什么,以及它的队列特定状态是什么。第二条信息是允许 RabbitMQ 启动、从磁盘恢复消息和队列的原因并确保每个队列中的消息与 RabbitMQ 关闭时的顺序相同。

      因此,RabbitMQ 的默认后备存储由一个节点全局消息存储组成,它只关注将消息内容写入磁盘;和每个队列队列索引,它使用非常不同的格式将每个队列数据的每个消息写入磁盘“

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-19
        • 2011-12-24
        • 2016-10-12
        • 2011-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多