emqx集群节点挂掉导致设备下线收不到事件及遗嘱消息

如题,因业务侧对设备连接管理比较严格,需要业务侧正确显示设备连接状态及历史上下线记录(含下线原因)。因此当设备以任何原因下线时,希望emqx能通知到业务侧。

使用5.3.2版emqx,尝试过$SYS、Flow中的$event、以及遗嘱消息,在emqx集群自身节点挂掉时(kill -9),皆无法收到设备下线事件。

测试方法:
3核心节点emqx集群,docker-compose部署
设备连接node1并设置遗嘱消息
在node3上尝试订阅$SYS、Flow转发的$event、遗嘱消息

结果:
设备主动断开皆有事件通知
直接kill掉node1节点,上述方法全部没反应

还剩webhook比较麻烦还未测试,但感觉没啥希望。而且webhook没找到失败补偿相关资料,其本身可靠性有待验证(业务上要求至少qos1级别的消息一定可达),不太适合

请问有没有可行方案?主动api轮询吗(规划设备百万级)?

kill -9 EMQX 无法发出任何消息。
目前是没有办法做到的,除非对指定 EMQX node 进行 client api 轮询,一直查,但百万量级 api 压力应该会很大。

  • EMQX 能运行时的上下线事件通过 SYS 主题/flow/webhook 等方式进行通知
  • 同时,轮询每个节点的 stats 接口监测 EMQX 节点状态。并且与 client 连接的节点信息(上线事件) 配合,如果监测到某个节点挂了,就认为这个节点上所有 connected 状态的客户端都在这一刻掉线。但这个方案会耦合客户端连接状态等信息。

感谢。顺便再问一个问题:
节点挂掉后,通过其他节点上的dashboard能看到接近实时的连接数更新,按理说也不能快速识别吧?这是怎么个机制呢?

每一个 mqtt 连接在 EMQX 上都有一个 erlang 进程维护。
当节点挂了之后,其他节点上的 process 死了,统计进程数量即可感知到连接数减少。

后续版本能否考虑下补充这块事件呢?或者至少单从协议上讲,无论什么原因导致下线,至少遗嘱消息应该被发出来吧?还是说协议只限了定客户端断开的场景,没细看不了解