代码之家  ›  专栏  ›  技术社区  ›  Pragmatic

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

  •  26
  • Pragmatic  · 技术社区  · 11 年前

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

    1) 在RabbitMQ中集群的情况下,如果一个节点发生故障,则将负载转移到另一个节点(而不停止其他节点)。类似地,我们还可以向现有集群添加新的新节点,而不必停止集群中的现有节点。这是正确的吗?

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

    提前感谢

    2 回复  |  直到 11 年前
        1
  •  27
  •   Deepak Bala    10 年前

    1) 在RabbitMQ中集群的情况下,如果一个节点发生故障,则将负载转移到另一个节点(而不停止其他节点)。类似地,我们还可以向现有集群添加新的新节点,而不必停止集群中的现有节点。这是正确的吗?

    如果创建队列的节点失败,只要启用了队列镜像,rabbitmq就会为集群中的该队列选择一个新的主节点。集群基于您可以定义的策略提供HA。

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

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

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

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

    总而言之

        2
  •  1
  •   Gupta    5 年前

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

    问题1) 在RabbitMQ中集群的情况下,如果一个节点发生故障,则将负载转移到另一个节点(而不停止其他节点)。类似地,我们还可以向现有集群添加新的新节点,而不必停止集群中的现有节点。这是正确的吗?

    回答:绝对正确(如果rabbitMQ在单个主机上运行),但rabbitIQ的队列在集群上的行为不同。队列仅在 默认情况下。但是 Rabbit(2.6.0) 为队列提供了内置的主动-主动冗余选项: mirrored queues 声明镜像队列就像声明正常队列一样;传递一个名为 x-ha-policy ; 告诉Rabbit您希望在集群中的所有节点上镜像队列。 这意味着,如果在声明队列后向集群中添加了新节点,它将自动开始托管队列的从属副本。

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

    此问题有多个子问题。

    现在节点之间的负载如何平衡?

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

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

    回答以上问题。

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

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