为什么连接断开2个小时之后会清除订阅信息

环境信息

  • EMQX 版本:
  • 操作系统及版本:
  • 其他
    在app切换到后台5分钟左右连接断开,2个小时左右订阅的主题被清除

问题描述

配置文件及日志

主题被清除是指dashboard上看不到了吗?设备离线之后,订阅关系就会清除掉,clean_session打开的话,还会短暂的保留一会,但是最终还是要被清除掉的

就是我clean_session打开,client断开连接,过一段时间大概两个小时左右,我这个client_id下面所有订阅列表就会被清除,有什么方法可以在设备离线后能保留该client_id下的订阅信息

./emqx_ctl subscriptions list
是通过这个命令去查看的

还是会超期呀,可以换个思路,用代理订阅功能,参考文档,这样即使设备从未订阅过,也可以做到登陆即有订阅

代理订阅的话,当客户端重新连接的时候,能恢复该客户端v之前的订阅关系吗,如果可以恢复的话,在我断开连接这段时间发送的消息能否再次收到

不可以,会重新建立session。企业版提供了离线消息缓存的功能,参考文档。不要依赖session来完成,session终究会有超时的时候,还是要靠额外的手段来控制业务完整

意思就是设备再次上线的时候可以恢复我之前的订阅关系(该客户端之前订阅的主题),但是无法收到在这段时间内的所发送的消息,如果是再我社保上线之后再发送的消息就可以收到

代理订阅是这个工作模式

还有一个就是borker重启之后之前的订阅关系能否恢复

不能,我们一般认为emqx不重启,长期服务

那万一断电或者宕机了呢,服务端能否恢复之前的订阅关系

不支持,断电宕机属于不可预估的情况,也无法估算恢复时间与恢复状态,这种情况下,无法预知影响

服务器运维的问题,这种情况下EMQX的状态已经不重要了,服务质量应该从机房开始保障

我觉得你应该考虑的是,怎么样管理业务流程,而不是一直在考虑极端情况的失败。
举个例子:
设备状态不好,断网断电之类的情况下,离线了,离线期间可能会有业务消息不想丢失。解决的办法应该是设备主动上报业务执行的进度,比如增加一个业务编号,每次登陆上报自己的状态以及业务执行的进度,服务端根据业务编号的进度,判断它执行到哪里了,然后决定是将历史业务再发给他,或者忽略。同时也能把控,在某些业务失败的情况下怎么处理。如果设备执行业务失败了,也应该主动上报执行失败的业务编号和原因。
不要把思路局限在依赖某个队列,或者某种缓存,来管理所有的业务