【问题标题】:How load balancer works in RabbitMQ负载均衡器在 RabbitMQ 中的工作原理
【发布时间】:2015-03-28 05:49:36
【问题描述】:

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

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

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

提前致谢

【问题讨论】:

    标签: rabbitmq load-balancing


    【解决方案1】:

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

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

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

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

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

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

    总结

    【讨论】:

      【解决方案2】:

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

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

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

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

      这个问题有多个子问题。

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

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

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

      回答上述问题。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-15
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-29
        相关资源
        最近更新 更多