会话里存了什么
会话状态包括客户端的订阅关系、QoS 1 与 QoS 2 中尚未确认的消息,以及进行中的报文标识。断线后是否保留这些状态由连接参数决定:3.1.1 通过一个清理会话标志控制,置否即保留;5.0 把它拆成清理启动与会话过期时间两个字段,过期时间到点后服务端自动清除会话。
两个版本对照
| 能力 | 3.1.1 的字段 | 5.0 的字段 |
|---|---|---|
| 断线后保留状态 | 清理会话置否 | 清理启动置否,且会话过期时间大于 0 |
| 离线期间缓存 QoS 1/2 消息 | 保留会话即可 | 保留会话并按服务端限额缓存 |
| 会话有效期控制 | 无原生字段,靠下次连接时清除 | 会话过期时间到点后服务端自动清理 |
| 客户端标识要求 | 保留会话必须使用固定标识 | 同样要求固定标识,并有过期时间兜底 |
典型使用场景
- 断网补传:现场网络中断期间平台下发的配置与指令在恢复后补发到设备
- 弱网设备:移动网络频繁切换时避免每次重连都重新订阅全部主题
- 指令可靠性:关键指令用持久会话加 QoS 1,减少依赖设备主动查询
- 临时诊断:短期开启持久会话观察消息是否堆积,判断链路质量
持久会话不会保存 QoS 0 消息:断线期间以该等级发布的数据必然丢失,需要补数据时应改用更高等级或由设备侧缓存。
大量设备长期使用持久会话却不再回来,会在服务端持续占用内存与磁盘。务必设置合理的会话过期时间与消息存储配额。