我正在驾驶兔子mq并发现它非常好。查看HA页面,我发现交换/队列复制效果很好。
我感到困扰的是,我必须使用TCP Loadbalancer来平衡节点之间的负载。这是对的吗?
我希望群集中有2个节点,并且具有“replicate-all”策略。
我希望发布者或消费者能够以类似循环的方式连接到所有节点。不幸的是,客户端API只允许每个连接设置一个主机。
是否有(第三方可能?)连接池之类的解决方案,以便发布者发布并且消费者从所有节点消费?
答案 0 :(得分:3)
我没有看到任何为AMQP / RabbitMQ做连接池的客户端。 AMQP使用通道在一个进程中处理多个发布者/使用者,一些客户端使其易于使用,但似乎不使用连接池处理节点的自动故障转移。
在群集中,无需连接到群集中的所有节点,将在群集中正确路由使用和发布操作。对于尝试管理具有多个订阅的单个或多个进程(每个连接至少消耗一个)的消费从未成为我的最高优先级。当多个进程消耗,每个进程随机连接到RabbitMQ时,如果其中一个RabbitMQ节点发生故障,您将能够保持可用性。
如果检测到故障导致不到一秒的中断,那么长期连接的发布者可以轻松地重新连接,在我工作过的任何事情上都不够小。
从几年的使用情况来看,我会说重新连接到新主机是故障转移期间的一个更简单的问题,难以解决的问题是在应用程序中管理现有AMQP连接的状态。在实践中,我只保留了可用主机列表,并为每个新连接选择下一个主机。连接关闭时,只需选择一个新主机并再试一次。它确实意味着您无法发布的短时间,如果您必须不断在PHP中建立新连接,则可能会更加困难。
由于flow control TCP负载均衡器可能更麻烦,因此它们是值得的。 TCP背压可能无法通过LB导致发布者的发布速度超过RabbitMQ可以处理的速度。在不科学的测试中,当负载平衡器落后于客户端时,我遇到了更多RabbitMQ稳定性问题。
答案 1 :(得分:0)
你没有提到你正在使用什么样的客户,但对于Python来说,有一个优秀的Kombu库。 Kombu支持connection and producer pools。
您还可以使用round-robbin,shuffle或自定义故障转移策略when settting up a connection指定多个AMQP服务器。
答案 2 :(得分:0)
提到了python nameko提出的实现HA(Rabbitmq)的方法here。 Nameko设法将此作为支持 library(kombu)支持round-robin failover
AMQP_URI: pyamqp://guest:guest@rabbitmq1:5672/;pyamqp://guest:guest@rabbitmq2:5672/