使用HAProxy作为RabbitMQ的负载均衡器不是最佳选择吗?

问题描述 投票:1回答:1

我正在为我的RabbitMQ集群找出最佳拓扑。我想要高可用性的队列。我在RMQ节点之前看到了很多有关将HAProxy用作循环负载均衡器的文章。

我的理解是,在具有镜像队列的RMQ群集中,首先将一条消息路由到该队列的主节点,然后将该消息复制到镜像。 RMQ客户端可以配置有多个节点,并且客户端知道哪个节点是其队列的主节点,因此将始终将消息路由到那里。

但是使用HAProxy,我失去了对客户端群集的了解。

例如我有一个带有3个镜像的队列的3节点集群。节点1是主节点,节点2和3是从节点。

  • 我的生产者产生了一条消息,它命中了HAProxy。 HAProxy将该消息路由到node1。 node1是主节点,因此它写入队列,然后将消息传播到节点2和3。
  • 下一条消息到达HAProxy,然后路由到node2。然后,在写入和传播此请求之前,Node2必须将该请求转发回给node1。
  • 下一条消息被路由到node3,并且必须再次发送回node1。

因此,只有三分之二的消息不必重新路由。另外,节点2和3正在做不必要的工作,接收消息并将它们路由到node1。

当然,优点是只需要在客户端上配置一个端点,并且能够自由更改集群拓扑,但是我说对了,这不是就消息吞吐量而言不是最佳的设置,我是否正确?

rabbitmq haproxy
1个回答
0
投票

尽管对于生产者而言,这确实是一个很好的设置,因为生产者不需要,这不需要使代理分发对消息发布者透明。

当然,您也提到过,进行升级/维护变得很容易。

但是,消息吞吐量是系统可能不同方面的因素。集群拓扑并不是唯一会影响它的拓扑。可以帮助您提高吞吐量的一些注意事项如下。

  • 确保您的队列不多

为了获得最佳性能,请确保您的队列始终保持尽可能短的时间。较长的队列会增加处理开销。

  • 使用持久消息和持久队列

请确保您的队列被声明为“持久”,并且您的消息以传递模式“持久”发送。

为了避免在代理中丢失消息,您需要为代理重新启动,代理硬件故障或代理崩溃做好准备。为确保消息和代理定义在重新启动后仍然有效,我们需要确保它们在磁盘上。代理重新启动期间,不持久和不持久的消息,交换和队列将丢失。

  • 保持相对较小的邮件大小

有时人们将大数据块作为消息正文的一部分推送给代理。消息大小过大会大大降低吞吐量。应用程序设计不应考虑大消息大小,通常大数据应驻留在代理外部,并且消息主体可能具有指向它的链接。

© www.soinside.com 2019 - 2024. All rights reserved.