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

时间:2018-11-01 06:57:56

标签: rabbitmq

根据https://groups.google.com/forum/#!topic/rabbitmq-users/vvWAymjDww4,如果队列跨多个服务器(节点)进行镜像,则发布者写入哪个队列都没有关系-RabbitMQ始终将邮件转发到主节点(队列是首次创建的。)

如果是这种情况,那么如果所有消息最终仍将路由到同一节点,那么将负载均衡器放在节点前面有什么意义?看来主节点将始终承担全部负载。

1 个答案:

答案 0 :(得分:1)

我将通过一个示例场景使其易于理解:

  • 您有一个2节点群集,并且顶部有一个负载均衡器
  • 客户端连接到LB,并连接到queue1所在的节点(主节点)
  • 队列已启用HA,因此queue1也被复制到node2
  • node1由于某种原因而失败,因此queue1的新主节点现在为node2
  • 客户端连接断开,并且LB现在将其连接到node2,因此对于客户端来说一切仍然正常

基本上,所有内容都与服务可用性有关。当您连接到一个节点,并且您要使用的队列不是主节点时,RabbitMQ在内部将您重定向到主节点,这最终可能会在集群中创建许多互连。

但是,如果主节点发生故障,RabbitMQ会选择一个新节点,因此在那里添加LB是一个很好的选择,客户端将重新连接到LB,并将其重定向到工作实例。客户的过程是透明的。

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