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

标签 rabbitmq

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

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

最佳答案

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

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

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

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

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

关于rabbitmq - 如果每条消息都将路由到主节点,为什么要在 RabbitMQ 节点集群(相同队列)前面放置负载均衡器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53096487/

相关文章:

rabbitmq - MassTransit 生成我想忽略的_skipped 队列

javascript - 我在 Mac 上使用 RabbitMQ for Node.js 时遇到错误

ruby - 为什么rabbitmq会丢失消息?

java - 如何在 Spring Boot 中将 Json 字节数组转换为 AMQP?

c# - 与 Console.ReadLine() 相关的 RabbitMQ BasicConsume 和事件驱动问题

java - SimpleMessageListenerContainer - 从失败中恢复

c# - C# 客户端上的 RabbitMQ 手动 ACK

java - Spring Cloud Stream 与 RabbitMQ 的连接

erlang - Windows x64 RabbitMQ 安装错误,Erlang 环境变量 (ERLANG_HOME)

msmq - RabbitMQ高速 transient 消息传递性能