首页/网络/工控与物联网速查/MQTT会话保持与离线消息恢复
物联网协议60 条

MQTT会话保持与离线消息恢复

会话保持决定断线重连后订阅关系与未确认消息是否还在:3.1.1 用清理会话标志,5.0 拆成清理启动与会话过期时间两个字段。持久会话能补发离线消息,但必须在服务端设置过期与配额。

工控与物联网速查网络更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌‌​‌‌​‌‌​‌​‌‌‌​​​‌​‌‌‌​‌​​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

会话里存了什么

会话状态包括客户端的订阅关系、QoS 1 与 QoS 2 中尚未确认的消息,以及进行中的报文标识。断线后是否保留这些状态由连接参数决定:3.1.1 通过一个清理会话标志控制,置否即保留;5.0 把它拆成清理启动与会话过期时间两个字段,过期时间到点后服务端自动清除会话。

两个版本对照

能力3.1.1 的字段5.0 的字段
断线后保留状态清理会话置否清理启动置否,且会话过期时间大于 0
离线期间缓存 QoS 1/2 消息保留会话即可保留会话并按服务端限额缓存
会话有效期控制无原生字段,靠下次连接时清除会话过期时间到点后服务端自动清理
客户端标识要求保留会话必须使用固定标识同样要求固定标识,并有过期时间兜底

典型使用场景

  • 断网补传:现场网络中断期间平台下发的配置与指令在恢复后补发到设备
  • 弱网设备:移动网络频繁切换时避免每次重连都重新订阅全部主题
  • 指令可靠性:关键指令用持久会话加 QoS 1,减少依赖设备主动查询
  • 临时诊断:短期开启持久会话观察消息是否堆积,判断链路质量
持久会话不会保存 QoS 0 消息:断线期间以该等级发布的数据必然丢失,需要补数据时应改用更高等级或由设备侧缓存。
大量设备长期使用持久会话却不再回来,会在服务端持续占用内存与磁盘。务必设置合理的会话过期时间与消息存储配额。

易错点

  • 开启持久会话却每次使用随机客户端标识:会话无法关联,等于没有保持
  • 以为持久会话能保存 QoS 0:离线期间该等级的消息不会被缓存
  • 不设置过期时间:离线设备的会话与积压消息长期堆积,最终耗尽服务端资源
  • 持久会话没有条数上限:设备长时间离线后重连,服务端一次性推送大量积压消息
  • 会话过期时间没有按业务设定:设得过长会长期占用服务端资源,设得过短则设备断线稍久消息就已失效

数据来源与参考

  • OASIS MQTT Version 3.1.1 规范(清理会话)
  • OASIS MQTT Version 5.0 规范(会话过期与清理启动)

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/ics/mqtt-session-persistence.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌‌​‌‌​‌‌​‌​‌‌‌​​​‌​‌‌‌​‌​​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​