Memory management RabbitMQ内存管理和复制

Memory management RabbitMQ内存管理和复制,memory-management,erlang,queue,rabbitmq,message-queue,Memory Management,Erlang,Queue,Rabbitmq,Message Queue,我目前正在评估RabbitMQ来管理队列。我想知道RabbitMQ如何管理内存中的队列项 在本例中,发布服务器订阅服务器 是否为每个订阅者(消费者)创建队列?例如,如果我有两个消费者,那么我会加倍内存使用来存储消息 我的印象是,如果我在一个队列上附加多个worker,那么它将成为一个工作队列,其中每个消费者接收到不同的消息 假设我正在为此构建聊天服务器。我是否需要为每个消费者创建队列?内存中的每条消息都会乘以连接的用户数?或者内存中只有一条消息,并且每个队列都有指向该消息的指针 同样在主题消息的

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

在本例中,发布服务器订阅服务器

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

我的印象是,如果我在一个队列上附加多个worker,那么它将成为一个工作队列,其中每个消费者接收到不同的消息

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

同样在主题消息的示例中

假设我有1kb的信息。那么2队列是否有2kb的内存使用量?Q1、Q2和假设消息匹配所有绑定密钥


如果我添加了另一个队列来侦听,那么让我说
lazy.blue.*
作为第三季度。这会在内存中创建新的队列项吗?并复制数据?

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

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

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

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

发件人:

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

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


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

我必须修复第一张图片。我的印象是,如果在单个队列中连接多个消费者,每个消费者将获得不同的数据。因为我希望每个消费者接收相同的数据,所以我必须为每个消费者创建单独的队列。这是真的吗?每一个新的消费者都会将存储在内存中的信息翻倍。我知道消息将被发送到3队列。但我想知道这样做的后果。那条信息会在内存中重复3次吗?或者它只存储一次,每个队列都有一个指向该消息的指针?如果您有多个使用者,那么对于一个队列,每个使用者将获得不同的消息。如果您希望每个消费者都获得相同的消息,那么您需要每个消费者一个队列,以及一个将消息转发到每个队列的交换机。我想您可能误解了mq。是的,理论上每个队列将有更多的内存使用。但关键是每一条信息都会很快被消耗掉。Rabbit mq在队列上没有太多消息的情况下工作得最好。谢谢@robthewolf,我真正理解队列的目的不是在内存中存储一些数据。但了解RabbitMQ的工作原理后,就可以做出设计体系结构的明智决策。