欢迎来到我们的MQTT 5基础知识系列的第4部分。在本系列的第3部分《MQTT 5:从MQTT 3.1.1升级的七个原因》中,我们阐述了MQTT用户升级到版本5的主要动机,强调了使MQTT 5成为有吸引力的升级的增强功能。在本文中,我们将专注于两个密切相关的功能:会话到期间隔和消息到期间隔。这些功能代表了MQTT 5中的关键改进,深入了解它们对于协议的最佳利用至关重要。
MQTT 5中的会话到期间隔和消息到期间隔是如何工作的?
让我们分别详细介绍和分析这两个重要的到期间隔功能。
MQTT 5中的会话到期间隔
会话到期间隔是客户端在连接(CONNECT)数据包阶段设置的参数,以秒为单位指定。此参数指示代理保留客户端会话信息的持续时间。如果此间隔设置为零,或者CONNECT数据包未指定到期值,那么一旦客户端的网络连接终止,会话数据将立即从代理中删除。值得注意的是,最大的会话到期间隔是(4,294,967,295),允许离线会话在客户端断开连接后延续超过136年。
![MQTT会话到期和消息到期间隔–MQTT 5要点第4部分插图 MQTT会话到期和消息到期间隔–MQTT 5要点第4部分-MQTT中文站](https://image.mqtt.cn/wp-content/uploads/2023/09/2023092907512415.png)
MQTT 5中的消息到期间隔
在MQTT 5中,客户端可以为每个PUBLISH消息设置一个唯一的消息到期间隔,以秒为单位。这个间隔确定了代理保留PUBLISH消息以供与主题匹配但当前离线的订阅者的持续时间。如果未定义间隔,代理必须无限期地保留匹配但断开连接的订阅者的消息。此外,如果在PUBLISH消息中选择 “retained=true” 选项,则该间隔还决定了消息在特定主题上保留的时间长度。
![MQTT会话到期和消息到期间隔–MQTT 5要点第4部分插图1 MQTT会话到期和消息到期间隔–MQTT 5要点第4部分-MQTT中文站](https://image.mqtt.cn/wp-content/uploads/2023/09/2023092907514513.png)
MQTT 5的会话到期间隔
MQTT 5中的会话到期间隔巧妙地同时满足了两个关键需求。早期版本的MQTT只提供了一个根据规范定义的删除持久会话的途径:要删除一个持久会话,必须使用与要丢弃的会话相同的客户端ID连接,并将标志设置为cleanSession=true。
考虑一些IoT设备永远不会重新连接的情况,原因可能是因为已经报废、损坏,或者因为在负载测试后未进行适当的清理而留下的会话。这些残留会话可能对代理的持久性造成不必要的负担。MQTT 5的会话到期间隔功能应运而生。这个直观的功能使用户能够指定一个合理的持续时间,之后代理会自动清除空闲会话,释放宝贵的资源。
除了这种自动清理功能之外,会话到期间隔还极大地简化了会话状态管理。Ian Craggs提供了两个示意图,显示了状态转换复杂性的降低。这种可视化呈现强调了这个新功能如何有助于简化状态转换并增强用户效率。
![MQTT会话到期和消息到期间隔–MQTT 5要点第4部分插图2 MQTT会话到期和消息到期间隔–MQTT 5要点第4部分-MQTT中文站](https://image.mqtt.cn/wp-content/uploads/2023/09/2023092907540463.png)
![MQTT会话到期和消息到期间隔–MQTT 5要点第4部分插图3 MQTT会话到期和消息到期间隔–MQTT 5要点第4部分-MQTT中文站](https://image.mqtt.cn/wp-content/uploads/2023/09/2023092907542415.png)
MQTT 5的消息到期间隔
与会话到期的间隔类似,消息到期的间隔始于对自动维护机制的需求。考虑到众多的IoT设备,比如设计用于长时间断网的连接汽车。MQTT通过持久会话和消息队列为这些情况提供了生命线。
为离线设备制定的消息存储在代理上,等待设备恢复连接以便传递。在大规模部署中,连接的设备数量可能升级到数千甚至数百万,因此对于每个客户端单独限制离线消息队列至关重要。
与IoT设备相关的消息的相关性的持续时间可能会出现显著的波动。以连接汽车为例:交通更新仅在短时间内保持相关性。但是,当我们考虑到空中固件升级时,即使汽车在数周之内保持离线,也需要执行这些
升级。
![MQTT会话到期和消息到期间隔–MQTT 5要点第4部分插图4 MQTT会话到期和消息到期间隔–MQTT 5要点第4部分-MQTT中文站](https://image.mqtt.cn/wp-content/uploads/2023/09/2023092907553798.png)
MQTT 5中的消息到期间隔正好是管理这些不同时间范围的完美工具,增加了协议的多功能性。
通过为具有有限相关性窗口的消息分配一个最佳的消息到期间隔,并为永久相关性的消息保留无到期时间,我们确保了代理资源的有效利用,以供可能离线相当长时间的客户端使用。这种策略还可以在重新连接时免除客户端被淹没在无关消息中。
对于保留的消息,消息到期间隔的操作方式类似,确保这些消息只发送给新的订阅者,以在指定的时间段内传递。
然而,需要注意的一个关键方面是,当客户端的会话到期时,为该客户端排队的所有消息也会与会话的到期一起过期,而不考虑它们各自的消息到期状态。这一“GOTCHA”是MQTT协议中会话及其排队消息之间相互关联性的重要提醒。
在使用MQTT 5的会话到期间隔和消息到期间隔时的重要提示
以下是一些重要信息:
会话到期间隔和消息到期间隔都对MQTT代理上的资源管理起到了关键作用。
回顾过去,许多MQTT 3用户表达了对到期功能的需求。HiveMQ回应了这一需求,在我们的MQTT平台中引入了会话和消息到期作为补充功能,这早于它们在MQTT 5中的标准化。
MQTT 3 CONNECT数据包中的cleanSession=true的等价物在MQTT 5中是sessionExpiry=0(或不存在)和cleanStart=true。
同样,MQTT 3 CONNECT数据包中的cleanSession=false在MQTT 5中的对应项是sessionExpire值大于零,再加上cleanStart=false。
MQTT代理,在服务器端提供了配置这些到期间隔的最大值的功能。在多供应商项目中,特别是当代理操作员可能无法控制MQTT客户端设置时,这个功能非常方便。
MQTT 5的出现引入了一系列旨在提高协议的可用性、灵活性和效率的新功能。会话到期间隔和消息到期间隔是这一点的最佳例证,它们是资源管理的宝贵工具,确保您的MQTT代理的顺畅运行。这两个功能都真正体现了MQTT标准对用户需求和挑战的响应,展示了它对于用户的需求和挑战的响应。
您必须登录才能发表评论。