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

问题描述 投票:0回答:2

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

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

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

rabbitmq load-balancing
2个回答
28
投票
  1. 运行 RabbitMQ 集群时,如果一个节点发生故障,负载将转移到另一个节点(不停止其他节点)。同样,我们也可以在不停止集群中现有节点的情况下向现有集群添加新节点。这是正确的吗?

如果创建队列的节点发生故障,只要启用了队列镜像,RabbitMQ 就会在集群中为该队列选举一个新的主节点。集群根据您可以定义的策略提供高可用性 (HA)。

  1. 假设我们从单个 RabbitMQ 节点开始,并在其上创建 100 个队列。现在假设生产者开始以更快的速度发送消息。为了处理这种负载,我们添加更多节点并创建一个集群。但队列仅存在于第一个节点上。现在节点之间负载如何均衡?

负载不平衡。分布式集群提供高可用性,但不提供负载均衡。您的请求将被重定向到队列所在集群中的节点。

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

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

总结一下

  • 为了获得高可用性,请在集群中使用镜像
  • 要平衡节点之间的负载,请使用 负载均衡器 (LB) 跨队列分配
  • 如果您想对队列本身进行负载平衡,请查看联合队列。它们允许您从上游队列获取下游队列上的消息。

1
投票

让我尝试以对大多数开发人员有帮助的方式回答您的问题。

问题1.运行RabbitMQ集群时,如果一个节点发生故障,负载会转移到另一个节点(不停止其他节点)。同样,我们也可以在不停止集群中现有节点的情况下向现有集群添加新节点。这是正确的吗?

你是完全正确的,假设 RabbitMQ 在单个主机上运行,但是 RabbitMQ 的队列在集群中的行为有所不同。默认情况下,每个队列仅驻留在集群中的一个节点上。然而,从 Rabbit 2.6.0 开始,我们为队列提供了内置的主动-主动冗余选项:镜像队列。声明镜像队列就像声明普通队列一样,但是您传递了一个名为

x-ha-policy
的额外参数。额外的参数告诉 RabbitMQ 您希望队列在集群中的所有节点上进行镜像。 这意味着,如果在声明队列后将新节点添加到集群中,它将自动开始托管队列的从属副本。

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

这个问题有多个子问题。

现在节点之间负载如何均衡?我们应该在哪个节点上添加队列?

设置为all,

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

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

您不应该这样做,尽管技术上可以(您必须在 LB 内调用 RabbitMQ API,这不是一个好的做法)。负载均衡器用于弹性消息基础设施。您的集群节点是负载均衡器后面的服务器,您的生产者和消费者是客户。

© www.soinside.com 2019 - 2024. All rights reserved.