为 rabbitmq 配置 HAProxy

为 rabbitmq 配置 HAProxy

我想使用 HAProxy 作为负载均衡器。我想在 haproxy 后面放置两个 rabbitmq 服务器。两个 rabbitmq 服务器位于 EC2 的不同实例上。我已按照以下步骤配置 HAProxy 服务器此引用。可以,但问题是消息未以循环模式发布。消息仅在一台服务器上发布。是否有适合我要求的不同配置?

我的配置在 /etc/haproxy/haproxy.cfg

listen  rebbitmq *:5672
        mode    tcp
        balance roundrobin
        stats enable
        option  forwardfor
        option  tcpka
        server  web2 46.XX.XX.XXX:5672 check inter 5000 backup
        server web1 176.XX.XX.XX:5672 check inter 5000 backup
listen  web-service *:80
          mode    http
         balance roundrobin
        option httpchk HEAD / HTTP/1.0
         option httpclose
        option forwardfor
        option httpchk OPTIONS /health_check.html
        stats enable
        stats refresh 10s
        stats hide-version
        stats scope   .
        stats uri     /lb?stats
        stats realm   LB2\ Statistics
        stats auth    admin:Adm1nn

更新:

我对此进行了一些研发,发现 HAProxy 会在 rabbitmq 服务器上循环连接。例如:如果我请求 10 个连接,那么它会在我的 2 个 rabbitmq 服务器上循环这 10 个连接并发布消息。

但问题是我想轮询消息,而不是连接。例如,如果我一次从 1 个连接发送 1000 条消息,那么 500 条消息应该发送到 Rabbit Server1,500 条消息应该发送到 Rabbit Server2。我应该遵循什么配置?

答案1

只要您的客户端保持与 HAProxy 的连接,从 HAProxy 到 RabbitMQ 的连接就不会移动。据我所知,HAProxy 是基于连接的负载均衡器,而不是基于消息的负载均衡器。它不知道消息何时开始或结束(它必须知道内部协议才能成功执行此操作)。

为了轮询 RabbitMQ 服务器,您需要让客户端连接到 HAProxy,发送消息,然后断开连接(不要保持连接打开)。重新连接以发送下一条消息,然后断开连接。

每次重新连接时,HAProxy 将会/应该将您移至不同的服务器。

答案2

坏兔子。坏。在 RabbitMQ 中建立连接和通道会产生一定程度的开销,并且在集群 RabbitMQ 环境中执行此操作时可能会增加延迟。您肯定不想连接、发送、断开连接。保持连接打开。RabbitMQ 速度非常快,并且有多种方法可以从中获得非常高的性能(例如,使用发布者确认而不是交易、使用内存消息等)。如果您在每条消息上断开/重新连接,您的应用程序性能就会下降。

您的应用程序每秒发送多少条消息?1000 条?RabbitMQ 可以处理。5000 条?简单。50K 条?现在我们需要开始做一些事情。请记住,这是通过连接的单个通道进行的。如果您使用的是多线程,则可以轻松获得每个通道 50K 条消息。

相关内容