我想使用 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 条消息。