我想使用HAProxy作为负载平衡器。 我想把两个rabbitmq服务器放在haproxy后面。 rabbitmq服务器都在EC2的不同实例上。 按照此参考configurationHAProxy服务器。 我的工作,但问题是消息不是发布在roundrobin模式。 消息只在一台服务器上发布。 我的要求是否有不同的configuration?
我在/etc/haproxy/haproxy.cfg中configuration
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个连接并发布消息。
但问题是我想循环的消息,而不是连接。 即如果我从一个连接发送1000 msg,那么500 msg应该去兔子服务器1和500 msg应该去兔子服务器2。 我必须遵循什么configuration?
只要你的客户端保持与HAProxy的连接,从HAProxy到RabbitMQ连接的连接将不会移动。 HAProxy是一个基于连接的负载均衡器,而不是基于消息(据我所知)。 它不知道消息什么时候开始或结束(它必须知道内部协议才能成功执行此操作)。
为了循环RabbitMQ服务器,您需要让客户端连接到HAProxy,发送消息,然后断开连接(不要保持连接打开)。 重新连接发送下一条消息,然后断开连接。
每次您重新连接,HAProxy将/应该将您移动到不同的服务器。
坏兔子 坏。 在RabbitMQ中build立连接和通道时会产生一定程度的开销,以及在集群化RabbitMQ环境中增加延迟的可能性。 你绝对不想连接,发送,断开连接。 保持连接打开。 RabbitMQ相当快,有很多方法可以获得真正的高性能(例如,使用发布者确认而不是事务,使用内存中的消息等)。 如果你断开连接/重新连接,你将终止你的应用程序性能。 单。 信息。
您的应用程序每秒发送多less条消息? 1000? RabbitMQ可以处理它。 5000? 简单。 50K? 现在我们需要开始做一些事情。 请记住,这是通过连接的单个通道。 如果你是multithreading的,你可以得到每个通道50K没有多less麻烦。