客户端运行一段时间后和emqx断开后重连无法订阅

环境信息

  • EMQX 版本:4.2.14
  • 操作系统及版本:centos7.9
  • 其他 http auth插件

问题描述

客户端连接emqx运行一段时间后有一部分客户端会和emqx断开连接(客户端用的是paho),断开后可后端是尝试重连,重连上后没有订阅,订阅为0;
1、这个现象有两个问题,为什么这几个客户端为什么会和emqx断开连接(排查网络是好的,emqx日志没发现问题);
2、查看了客户端日志,有重连emqx的操作,但是否连上或者连上进入回调订阅都没有执行。。
踢掉后重连就订阅成功了。

配置文件及日志

1.检查下客户端有没有设置 keepalive,或者调低 EMQX 日志等级,进一步排查原因
2.如果连接时没有设置会话超时时间,则连接断开后,会话会被清除掉
3.如果设置了会话超时时间,重连接时 clean_session = true,则原有的会话也会被清除掉

keepalive 是10s clean_session是true mqtt协议是5.0 ,这个keepalive多少比较合适?

keepalive 设置根据你的网络和消息频率来比较好, 如果客户端一直没有上传任何信息,EMQX 大概会在 2 ~ 3个 keepalive 后关闭连接,如果不希望发生这种情况,需要客户端按照协议,定时向EMQX发送心跳包(PINGREQ)
如果希望重连保留之前的会话内容,则 clean_session 应该设置为 false

还要请教一下,存不存在emqx没有下发回复心跳的可能(由于处理数据多),运行一段时间有几台客户端突然断开(同一时间段,相差5分钟内)重连,网络排查和客户端排查应该没问题,,由于这种情况很难复现,再开日志级别排查估计要等很久。。。就是根据您的经验有没有可能emqx某些bug导致一些客户端下线?

不会的,心跳响应包是机械式的检查到就回复。

日志级别调低的时候会打印很多日志,这个会影响emqx性能吗?如果不影响,那就调到最低,后面有报错可以排查

会影响,推荐在测试环境使用debug,生产环境waning以上

嗯,对了对于这种偶发连接上未能订阅上的问题,可否借助规则引擎之类的操作,判断存在订阅为0的,踢掉重新连接(踢掉重连都能订阅成功)

如果你的订阅是固定的,可以尝试代理订阅功能,不用依赖客户端自己完成

规则引擎没有这种功能

我看了下代理订阅,,有个缺点,,就是配置后每一个客户端都要按照这个配置订阅,,有没有类似于黑名单之类的,某些客户端不采用这个规则

有,但属于企业功能,看下这个文档