我有一个包含2个RabbitMQ节点的集群(每个节点运行带有MQTT插件的RabbitMQ版本3.6.10)和一个AWS经典负载均衡器。服务器和客户端交换MQTT消息。
客户端(在移动设备上运行并使用Eclipse Paho客户端lib的应用程序)连接到以循环方式分发连接的负载均衡器。
当我关闭一个节点,比如说Node1时,所有连接到Node1的客户端都会收到一个回调,表明与代理的连接丢失了。 这些客户端尝试重新连接但连接尝试失败,表明代理无法访问。 从AWS控制台我可以看到AWS ELB检测到Node1已关闭并将其标记为“OutOfService”。 来自新客户端的连接请求被路由到“InService”节点Node2;但是,以前连接到Node1的现有客户端的连接请求总是失败!
ELB配置的空闲超时为180秒。在ELB中启用或禁用连接耗尽没有任何区别。
是否有任何特定配置使ELB 忘记现有客户端已连接到Node1并允许它们连接到Node2?
答案 0 :(得分:0)
我尝试添加以下HA策略: rabbitmqctl set_policy ha-mqtt“^ mqtt”\'{“ha-mode”:“exact”,“ha-params”:2,“ha-sync-mode”:“automatic”}'
有了这个策略,所有为MQTT客户端创建的队列都被镜像了。现在,当Node1关闭时,来自现有客户端ID的连接尝试也会路由到另一个活动节点!
这让我想知道MQTT客户端的客户端ID与它们与代理节点的连接之间的关系是什么?我认为只有在队列主节点关闭时才保留和访问尚未确认的消息,才需要镜像队列。但我发现客户甚至无法建立连接!