rabbitmq - 如果每条消息都将路由到主节点,为什么要在 RabbitMQ 节点集群(相同队列)前面放置负载均衡器?
问题描述
根据https://groups.google.com/forum/#!topic/rabbitmq-users/vvWAymjDww4,如果一个队列镜像到多个服务器(节点),则发布者写入哪个队列都没有关系 - RabbitMQ 将始终将消息转发到主节点(第一次创建队列的节点)。
如果是这种情况,如果每条消息最终都会路由到同一个节点,那么在节点前面放置一个负载均衡器又有什么意义呢?似乎主节点将始终承担全部负载。
解决方案
我将放置一个示例场景以使其易于理解:
- 您有一个 2 节点集群,并且顶部有一个负载均衡器
- 客户端连接到 LB,并连接到 node1,这是 queue1 所在的位置(master)
- 队列启用了 HA,因此 queue1 也在 node2 上复制
- node1 由于某种原因失败了,所以 queue1 的新 master 现在是 node2
- 客户端连接断开,LB 现在将他连接到 node2,所以客户端一切正常
基本上,这都是关于服务可用性的。当你连接到一个节点,而你正在消费的队列不是主节点时,RabbitMQ 内部会将你重定向到主节点,这最终会在集群中创建大量的互连。
但是如果主节点发生故障,RabbitMQ 会选择一个新节点,因此在那里有一个 LB 是一个很好的补充,客户端将重新连接到 LB 并将其重定向到一个工作实例。客户的流程是透明的。
最后,根据您的用例,您可以做一些巧妙的事情来确保客户端始终连接到主队列所在的实例,但这实际上取决于您的具体要求。
推荐阅读
- html - 这是我的代码, :first-child 不起作用?
- javascript - 使用 Javascript 将页面导出为 PDF
- java - 扩展扩展另一个抽象类的抽象类时的构造函数问题
- networking - java - 如何使多个虚拟终端设备在使用java的虚拟网络udp通信中与协调器通信?
- gitlab - 排除 merge_request,在 gitlab CI 管道中推送创建作业
- json - 如何在我的逻辑应用程序中测试动态 json 表达式
- javascript - 使用 D3.js 在 SVG 内显示一个圆圈
- python - np.linalg.eigh() 的 Numpy 分段错误
- jmeter - 无法在 Apache JMeter 1.6 中打开插件管理器
- java - Java + Visual Studio 资源文件夹,以便我可以执行 getResourceAsStream(this.FILE_NAME)