让我们考虑下面的情景。
在集群模型中部署了3个RabbitMQ代理(B1,B2,B3)。有一个交换E与绑定,复制到所有3个经纪人。有一个生产者P和3个消费者C1,C2,C3。我有以下问题
假设生产者连接到代理B1并创建一个镜像到B2的队列Q.现在,当消费者连接到Broker B3时,它如何获取队列中的消息?
根据我的理解,交换和绑定信息在每个代理的内存中维护。如果交换是持久的,为了从代理崩溃中恢复,交换和绑定信息是否也存在于所有代理的磁盘中?
如果整个队列在所有镜像代理的内存中维护,则会占用代理中的大量内存。为了支持每个代理中可能包含数百万条消息的大量队列,这不是可扩展性的约束吗?
答案 0 :(得分:1)
每个镜像队列都有一个主节点。该队列的主节点始终用于使用。因此,当消费者连接到没有队列存储(或者是从节点)的节点时,消费者实际上最终会从主节点消费。
是的,假设节点是磁盘节点而不是RAM节点。我不是100%肯定绑定,但我的猜测是肯定的。无论如何,强烈建议您始终声明客户需要的所有队列,交换等等! (每次客户启动时都这样做)
是的,这是镜像的重点:在出现问题时添加冗余。它不会提高性能(相反!)。但总的来说,拥有数百万条消息的队列并不是一个好的情况,因为队列平均应该是空的