跨节点平衡RabbitMQ主队列

时间:2017-10-19 16:26:15

标签: rabbitmq load-balancing

我有一个包含3个RabbitMQ节点的集群,我希望在所有节点之间保持主队列平衡,即使在节点重新启动后也是如此。但是,当新节点加入群集或其中一个节点断开连接并重新连接时,主队列不会重新平衡。

示例:我在节点A,B和C上创建了100个队列。 如果节点C关闭,则来自C的主队列在节点A和B之间几乎同等地重新平衡。因此,此时节点A和B都有大约50个主队列。 现在,如果我重新连接节点C,它将保留0个主队列,直到创建新队列。这是有问题的,因为我希望我的所有节点都能产生相同的工作量。

我的交换是耐用品,我的队列是耐用品和镜像,我的消息是持久的。我想避免丢失消息。

我知道change the master node manually using a policy trick有办法。但这并不令人满意,因为它会破坏HA(通过诱导所有镜像的重新同步)。

2 个答案:

答案 0 :(得分:2)

一种解决方案是使用Federated Queues

  

联合队列链接到其他队列(称为上游队列)。它将从上游队列中检索消息,以满足对来自本地消费者的消息的需求。

您可以创建一个全新的群集,该群集既可以是原始群集的上游和下游。您还需要确保发布者和消费者定期重新连接(以避免一个群集独占所有连接,从而阻止负载平衡)。

正如你所指出的,还有来自rabbitmq-users小组的Simon MacMullen的伎俩。

# rabbitmqctl set_policy --apply-to queues --priority 100 my-queue '^my-queue$' '{"ha-mode":"nodes", "ha-params":["rabbit@master-node"]}'
# rabbitmqctl clear_policy my-queue

但它有一个不利的副作用,使镜像松散同步一段时间。这可能是可以接受的,取决于你的要求,所以我认为值得说它是可能的。

更高级的技术可能会出现在4.x中,但它根本不确定。

答案 1 :(得分:1)

您可以使用以下命令:

rabbitmq-queues rebalance type --vhost-pattern pattern --queue-pattern pattern

例如

rabbitmq-queues rebalance "all" --vhost-pattern "a-vhost" --queue-pattern ".*"