负载均衡器如何在RabbitMQ中工作

时间:2015-01-29 04:59:39

标签: rabbitmq load-balancing

我是RabbitMQ的新手,所以请原谅我琐碎的问题:

1)如果在RabbitMQ中进行群集,如果某个节点出现故障,请将负载转移到另一个节点(不停止其他节点)。同样,我们也可以在不停止集群中的现有节点的情况下向现有集群添加新的新节点。这是对的吗?

2)假设我们从一个rabbitMQ节点开始,并在其上创建100个队列。现在,制作人开始以更快的速度发送消息要处理此负载,我们会添加更多节点并创建一个集群。但队列仅存在于第一个节点上。现在节点之间的负载如何平衡?如果我们需要添加更多队列,我们​​应该在哪个节点添加它们?或者我们可以使用负载均衡器添加它们。

提前致谢

2 个答案:

答案 0 :(得分:15)

  

1)如果在RabbitMQ中进行群集,如果某个节点出现故障,请将负载转移到另一个节点(不停止其他节点)。同样,我们也可以在不停止集群中的现有节点的情况下向现有集群添加新的新节点。这是对的吗?

如果创建队列的节点出现故障,只要启用了队列镜像,rabbitmq就会为群集中的该队列选择一个新的主服务器。群集根据您可以定义的策略提供HA。

  

2)假设我们从一个rabbitMQ节点开始,并在其上创建100个队列。现在,制作人开始以更快的速度发送消息要处理此负载,我们会添加更多节点并创建一个集群。但队列仅存在于第一个节点上。现在节点之间的负载如何平衡?

负载不均衡。分布式群集提供HA而不是负载平衡。您的请求将被重定向到队列所在的集群中的节点。

  

如果我们需要添加更多队列,我们​​应该在哪个节点上添加它们?或者我们可以使用负载均衡器添加它们。

这取决于您的使用案例。有些人使用循环法并在不同的节点上创建队列。

总结

答案 1 :(得分:1)

让我试着回答你的问题,这通常是大多数开发人员可能会遇到的。

问题 1) 在 RabbitMQ 集群的情况下,如果一个节点出现故障,负载转移到另一个节点(不停止其他节点)。同样,我们也可以在不停止集群中现有节点的情况下向现有集群添加新节点。对吗?

<块引用>

答案:完全正确(如果rabbitMQ 在单个主机上运行)但是rabbitMQ 的队列在集群上的行为不同。默认情况下,队列只存在于集群中的一个节点上。但是 Rabbit(2.6.0) 为我们提供了一个内置的队列双活冗余选项:mirrored queues。声明一个镜像队列就像声明一个普通队列;您传递了一个名为 x-ha-policy 的额外参数;告诉 Rabbit 你希望队列在集群中的所有节点上被镜像。 这意味着如果在声明队列后将新节点添加到集群中,它将自动开始托管队列的从属副本。

问题 2) 假设我们从一个 rabbitMQ 节点开始,并在其上创建 100 个队列。现在生产者开始以更快的速度发送消息。为了处理这种负载,我们添加了更多节点并创建了一个集群。但是队列只存在于第一个节点上。现在节点间负载均衡如何?如果我们需要添加更多队列,我们​​应该在哪个节点上添加它们?或者我们可以使用负载均衡器添加它们。

这个问题有多个子问题。

<块引用>

现在节点间负载均衡如何?

<块引用>

设置为 all,x-ha-policy 告诉 Rabbit 您希望队列在集群中的所有节点之间进行镜像。这意味着如果在声明队列后将新节点添加到集群中,它将自动开始托管队列的从属副本。

<块引用>

我们应该在哪个节点上添加它们?

<块引用>

回答以上问题。

<块引用>

我们可以使用负载均衡器添加它们吗?

<块引用>

不,但是是的(您必须在 LB 中调用 rabbitMQ API,这不是最佳实践方法),负载均衡器用于弹性消息传递基础设施。您的集群节点是负载均衡器背后的服务器,而您的生产者和消费者是客户。