如果每条消息都将路由到主节点,为什么要在一组 RabbitMQ 节点(同一队列)之前放置负载均衡器?

Sti*_*fán 1 rabbitmq

根据https://groups.google.com/forum/#!topic/rabbitmq-users/vvWAymjDww4,如果队列跨多个服务器(节点)镜像,发布者写入哪个队列并不重要 - RabbitMQ 将始终将消息转发到主节点(首次创建队列的节点)。

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

Mag*_*ama 6

我将放一个示例场景以使其易于理解:

  • 您有一个 2 节点集群,并且顶部有一个负载均衡器
  • 客户端连接到LB,并连接到node1,这是queue1所在的(master)
  • 队列启用了 HA,因此 queue1 也在 node2 上复制
  • node1 由于某种原因失败,所以 queue1 的新主节点现在是 node2
  • 客户端连接断开,LB 现在将他连接到 node2,所以客户端一切正常

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

但是如果主节点出现故障,RabbitMQ 会选择一个新节点,因此在那里拥有一个 LB 是一个很好的补充,客户端将重新连接到 LB 并将它重定向到一个工作实例。客户端的过程是透明的。

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

  • 谢谢。那么负载均衡实际上并不是为了分担负载,而是为了确保客户端始终能够到达可用节点之一? (2认同)