如果每条消息都将路由到主节点,为什么要将负载平衡器放在RabbitMQ节点集群(相同队列)的前面?

如果每条消息都将路由到主节点,为什么要将负载平衡器放在RabbitMQ节点集群(相同队列)的前面?,rabbitmq,Rabbitmq,根据,如果队列跨多个服务器(节点)镜像,则发布服务器写入哪个队列无关紧要—RabbitMQ将始终将消息转发到主节点(队列第一次创建的节点) 如果是这种情况,那么如果每条消息最终都会被路由到同一个节点,那么在节点前面放置负载平衡器有什么意义呢?主节点似乎总是承担整个负载。我将给出一个示例场景,以便于理解: 您有一个2节点的集群,顶部有一个负载平衡器 客户端连接到LB,并连接到节点1,该节点是queue1所在的位置(主节点) 队列已启用HA,因此队列1也在节点2上复制 node1由于某种原因失败,

根据,如果队列跨多个服务器(节点)镜像,则发布服务器写入哪个队列无关紧要—RabbitMQ将始终将消息转发到主节点(队列第一次创建的节点)


如果是这种情况,那么如果每条消息最终都会被路由到同一个节点,那么在节点前面放置负载平衡器有什么意义呢?主节点似乎总是承担整个负载。

我将给出一个示例场景,以便于理解:

  • 您有一个2节点的集群,顶部有一个负载平衡器
  • 客户端连接到LB,并连接到节点1,该节点是queue1所在的位置(主节点)
  • 队列已启用HA,因此队列1也在节点2上复制
  • node1由于某种原因失败,因此队列1的新主节点现在是node2
  • 客户端连接断开,LB现在将他连接到节点2,因此客户端的一切仍然正常
基本上,这都是关于服务可用性的。当您连接到一个节点,并且您使用的队列不是主节点时,RabbitMQ会在内部将您重定向到主节点,这最终会在集群中创建大量的内部连接

但是如果主节点失败,RabbitMQ会选择一个新节点,因此有一个LB是一个很好的补充,客户端将重新连接到LB,它将被重定向到一个工作实例。客户端的过程是透明的


最后,根据您的用例,您可以做一些巧妙的事情来确保客户机始终连接到主队列所在的实例,但这实际上取决于您的具体需求。

我将给出一个示例场景,使其易于理解:

  • 您有一个2节点的集群,顶部有一个负载平衡器
  • 客户端连接到LB,并连接到节点1,该节点是queue1所在的位置(主节点)
  • 队列已启用HA,因此队列1也在节点2上复制
  • node1由于某种原因失败,因此队列1的新主节点现在是node2
  • 客户端连接断开,LB现在将他连接到节点2,因此客户端的一切仍然正常
基本上,这都是关于服务可用性的。当您连接到一个节点,并且您使用的队列不是主节点时,RabbitMQ会在内部将您重定向到主节点,这最终会在集群中创建大量的内部连接

但是如果主节点失败,RabbitMQ会选择一个新节点,因此有一个LB是一个很好的补充,客户端将重新连接到LB,它将被重定向到一个工作实例。客户端的过程是透明的


最后,根据您的用例,您可以做一些巧妙的事情来确保客户端始终连接到主队列所在的实例,但这实际上取决于您的具体需求。

谢谢。因此,LB并不是真正意义上的共享负载,而是确保客户机始终能够到达其中一个可用节点?这是正确的。您仍然可以让您的客户机硬编码所有群集DSN,但这确实是一个更有限的问题解决方案。谢谢。因此,LB并不是真正意义上的共享负载,而是确保客户机始终能够到达其中一个可用节点?这是正确的。您仍然可以让您的客户机硬编码所有集群DSN,但这实际上是一个更有限的解决方案。