演示平台 文档中心 开发接口 官方网站

MQTT链接掉线的原因分析

1. ClientID不能变化,每次res启停都是相同的,不管什么时候,一个res应用,对应的ClientID要恒定不变。可以基于app_ip+app_port+emqx_ip这种类似思路,进行锁定ClientID。这样EMQX这边就不会出现虚拟的消费者连接。
2. 将cleanSession配置为true,每次mqtt连接断掉后,EMQX端就不要继续保持对应连接的session,EMQX这里就会立即踢掉断线的session,不会出现潜在的接收消息的订阅者,此种情况下,及时ClientID每次不一样,也不会出现虚拟消费者。

收藏

    2019-11-15 07:36:40

    不管clean session的值是什么,当终端设备离线时,QoS=0,1,2的消息一律接收不到。
    当clean session的值为true,当终端设备离线再上线时,离线期间发来QoS=0,1,2的消息一律接收不到。
    当clean session的值为false,当终端设备离线再上线时,离线期间发来QoS=0,1,2的消息仍然可以接收到。如果同个主题发了多条就接收多条,一条不差,照单全收。

    回复 |  引用
    2019-11-15 07:31:10

    解决方案:

      让消费端的ClientId为随机字符串。这样ClientId就不会重复。

    mqtt.consumer.client-id=${random.value}

      

    回复 |  引用
    2019-11-15 05:59:46

    共享订阅功能非常实用,解决了消费者应用程序的负载均衡问题,或者说高可用问题。否则,负载均衡或者高可用问题,需要借助于全局锁进行消息消费过程中的只消费一次的问题。这个实现起来,相对比较的麻烦,主要是稳定性和并发支持上要花很多精力调优。现在EMQX已经做了这个,已共享订阅的方式为应用程序的开发提供了便利。

    共享订阅支持两种方式:

    订阅前缀   使用示例 $queue/ mosquitto_sub -t ‘$queue/topic’ $share/<group>/ mosquitto_sub -t ‘$share/group/topic’

    目前,我们的物联网平台中采用的是$share/<group>这种方式,主要有$share/dcX/yourTopic,和$share/resX/yourTopic这两种应用场景。

    回复 |  引用
共3条 1

登录 后发表评论。没有帐号? 注册 一个。

2019-11-15 05:58:39 29 次浏览 3 个评论