这是关于MQTT协议和使用MQTT客户端的一般问题。特别是我使用mosquitto作为服务器,使用ruby-mqtt作为客户端。
MQTT提供持久会话的概念,意味着保留以前的订阅,并且qos>的消息保留。客户端断开连接时,0排队。这意味着对于我的客户端实现,我可以在连接到代理后跳过订阅,除了第一次。
问题是:我怎样才能确定我的订阅仍在那里?我想可能会出现一个新服务器启动的情况,它没有关于我以前的会话以及我的订阅的信息。
答案 0 :(得分:2)
为了与我的合作伙伴发生冲突,MQTT v3.1.1为代理提供了一种机制,告诉客户重新连接会话已恢复。这是CONNACK消息期间提供的“会话存在”标志。
表示支持MQTT v3.1.1的客户端/经纪人应支持此标志。例如,Paho 1.0客户端都应该这样做(Python客户端肯定会这样做),即将发布的mosquitto 1.4版本增加了对此标志的支持,以支持其对MQTT v3.1.1的现有支持。
同样值得注意的是,这个 是一个有用的功能,因为MQTT v3.1.1要求在每个SUBSCRIBE上传输保留的消息,无论先前是否存在订阅。
答案 1 :(得分:1)
实现持久会话的代理应该将该信息存储到磁盘/数据库,以便在重新启动时能够存活。企业代理(例如IBM MQ)甚至可以跨多个代理实例联合此信息以提供故障转移。
话虽如此,你通过跳过再次请求订阅实际节省了什么?
答案 2 :(得分:1)
MQTT协议规范中无法知道您的订阅是否存在。
它取决于代理:它可以支持永久存储来保存持久订阅,以避免在发生故障(关闭)时丢失它们。
在客户端,基于协议,您知道在连接消息中使用clean session = FALSE,您不需要在下次重新连接时进行订阅。它并不依赖于你,而是依赖经纪人。
保罗。
答案 3 :(得分:1)
您无法确定,这就是为什么我建议每次在应用程序启动时订阅您感兴趣的主题,以及与clean_session = False
连接时。