会话过期

更新时间:

本文为您介绍MQTT 5.0的新特性会话过期。

功能介绍

会话过期(Session Expiry Interval)是指在客户端和服务端(Broker)之间的会话结束后,会话状态数据被保留一段时间。会话状态包括未确认的QoS 1消息、客户端的订阅等。会话过期时间可以在客户端连接到MQTT服务端的时候,在CONNECT消息的会话过期间隔(Session Expiry Interval)字段中指定。

使用限制

  • 如果没有设置则默认为0,断开连接会话立即过期。如果设置了过期时间则最小过期间隔不少于10分钟,小于10分钟的情况下,按照10分钟设置。

  • 会话过期时间最大值为:2147483647。

  • 如果有且仅订阅使用了P2P消息,则不支持Session过期特性。

使用说明

  • 会话过期时间(单位:秒):

    • 设置为“0”表示会话结束后立即过期。

    • 设置大于0的值表示会话将保持多长时间。

使用场景

  • 断连重连场景:在网络不稳定或者移动环境中,例如车联网,客户端的连接可能频繁中断,通过设置较长的会话过期时间,确保连接重建后会话可以无缝恢复。

  • 临时设备连接:对于那些短暂连接、发送少量数据后即断开连接的设备(如一次性数据上报设备或临时加入网络的传感器),可以设置较短的会话过期时间,这样可以有效释放服务器资源,避免无用会话占用存储。

  • 安全与隐私保护:在对数据保密性和隐私有严格要求的应用中,可以设置合理的会话过期时间,确保在客户端长时间不活动后,其会话状态和相关数据被自动清除,降低数据泄露的风险。

MQTT 5.0的会话过期的功能,可以以根据不同的应用场景灵活调整会话过期时间,以达到最佳的系统性能、资源利用率和用户体验。

消息示例

例如,有一个应用场景,其中一个IoT设备需要经常断开并重新连接到MQTT服务端。为了在设备断线时不丢失其订阅和消息,这时可以使用MQTT 5.0的会话过期特性。

此处展示该特性在设备首次连接和后续重连接时的使用:

首次连接

设备首次连接到MQTT服务端,发送一个CONNECT消息,并设置会话过期间隔为4个小时。这意味着即使设备断开连接,MQTT服务端将保留其会话状态(包括订阅和队列中的消息)最多4个小时。

CONNECT
ClientId: IoT_Device123
Session Expiry Interval: 14400 // 4小时,以秒为单位
Clean Start: 0 // 用于指示服务端继续使用现有的会话
// 其他需的CONNECT报文信息

在这4个小时内,如果设备因为网络问题导致连接断开,MQTT服务端会保持该设备的所有订阅和未确认的消息。

重连接

CONNECT
ClientId: IoT_Device123
Session Expiry Interval: 14400 // 再次指定为4小时
Clean Start: 0 //告诉服务端使用上次保存的会话
// 其他需的CONNECT报文信息

当IoT设备恢复连接时,由于之前的会话并未过期,服务端将使用之前保存的会话状态,包括IoT设备的订阅信息,以及它因断线而未能收到的任何消息,这一切将在重连接后送达给设备。

超时情形

如果IoT设备在超过4个小时而没有重连,那么MQTT服务端就会清除相关的会话状态。此时,如果IoT设备再次连接,它需要像首次连接一样重新建立新的会话,包括重新订阅所需的主题,并且先前队列中的消息则会丢失。