程序员

MQTT 持久会话 vs. Clean Session内幕一网打

2024-01-02  本文已影响0人  JavaEdge

1 前言

物联网应用两大难题,MQTT 客户端与服务器的连接可能随时因网络波动及资源限制而异常断开。为解决网络连接断开对通信造成的影响,MQTT 协议提供持久会话功能。

MQTT 客户端在发起到服务器的连接时,可设置是否创建一个持久会话。持久会话会保存一些重要数据,以使会话能在多个网络连接中继续。

2 作用

3 持久会话需存储哪些数据?

通过上文我们知道持久会话需要存储一些重要的数据,以使会话能被恢复。这些数据有的存储在客户端,有的则存储在服务端。

客户端中存储的会话数据:

服务端中存储的会话数据:

4 MQTT Clean Session

控制会话状态生命周期的标志位:

持久会话能被恢复的前提是客户端使用固定 Client ID 再连,如 Client ID 动态,连接成功后将会创建一个新的持久会话。

如下Dashboard,图中连接虽然是断开状态,但因是持久会话,仍能被查看到,且可在 Dashboard 中手动清除该会话:

MQTT 持久会话

EMQX 也支持在 Dashboard 设置 Session 相关参数。

EMQX Dashboard

MQTT 3.1.1 没规定持久会话何时过期,仅从协议层理解,这持久会话应永久存在。但实际场景不现实,因为它非常占服务端资源,所以服务端实际向用户提供一个全局配置来限制会话过期时间。如设置会话过期时间 5 min,最大消息数为 1000 条,且不保存 QoS 0 消息。

5 使用

打开 MQTTX 后如下所示,点击 New Connection 按钮创建一个 [MQTT 连接]。

MQTT Client

创建名为 MQTT_V3 的连接,Clean Session 为关闭状态(即为 false),MQTT 版本选择 3.1.1,然后点击右上角的 Connect 按钮。

创建 MQTT 连接

连接成功后订阅 clean_session_false 主题,且 QoS 设置为 1。

订阅 MQTT 主题

订阅成功后,点击右上角的断开连接按钮。然后,创建一个名为 MQTT_V3_Publish 的连接,MQTT 版本同样设置为 3.1.1,连接成功后向 clean_session_false 主题发布两条 QoS 1 消息。

发布 MQTT 消息

然后选中 MQTT_V3 连接,点击连接按钮连接至服务器,将会成功接收到两条离线期间的消息。

接收 MQTT 消息

6 MQTT 5.0 中的会话改进

MQTT 5.0 中将 Clean Session 拆成:

Clean Start 为 true 时表示必须丢弃任何已存在的会话,并创建一个全新的会话;为 false 时表示必须使用与 Client ID 关联的会话来恢复与客户端的通信(除非会话不存在)。

Session Expiry Interval 解决了 MQTT 3.1.1 中持久会话永久存在造成的服务器资源浪费问题。设置为 0 或未设置,表示断开连接时会话即到期;设置为大于 0 的数值,则表示会话在网络连接关闭后会保持多少秒;设置为 0xFFFFFFFF 表示会话永远不会过期。

7 FAQ

当会话结束后,保留消息还存在么?

[MQTT 保留消息]不是会话状态的一部分,它们不会在会话结束时被删除。

客户端如何知道当前会话是被恢复的会话?

MQTT 协议从 v3.1.1 开始,就为 CONNACK 报文设计了 Session Present 字段。当服务器返回的该字段值为 1 时,表示当前连接将会复用服务器保存的会话。客户端可通过该字段值决定在连接成功后是否需要重新订阅。

使用持久会话的建议

8 总结

至此完成对 MQTT 持久会话的介绍,并通过桌面客户端演示了 Clean Session 的使用。读者可参考本文借助 MQTT 持久会话实现离线消息的接收及降低订阅开销。

作者简介:魔都国企技术专家,多家大厂后台研发和架构经验,负责复杂度极高业务系统的模块化、服务化、平台化研发工作。具有丰富带团队经验,深厚人才识别和培养的积累。

参考:

编程严选网

本文由博客一文多发平台 OpenWrite 发布!

上一篇 下一篇

猜你喜欢

热点阅读