MQTT和AWS ELB:如何使ELB _forget_到客户端先前连接到哪个节点?

时间:2017-06-02 10:20:22

标签: rabbitmq mqtt amazon-elb

我有一个包含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?

1 个答案:

答案 0 :(得分:0)

我尝试添加以下HA策略: rabbitmqctl set_policy ha-mqtt“^ mqtt”\'{“ha-mode”:“exact”,“ha-params”:2,“ha-sync-mode”:“automatic”}'

有了这个策略,所有为MQTT客户端创建的队列都被镜像了。现在,当Node1关闭时,来自现有客户端ID的连接尝试也会路由到另一个活动节点!

这让我想知道MQTT客户端的客户端ID与它们与代理节点的连接之间的关系是什么?我认为只有在队列主节点关闭时才保留和访问尚未确认的消息,才需要镜像队列。但我发现客户甚至无法建立连接!