首页/网络/工控与物联网速查/MQTT保留消息的场景与副作用
物联网协议60 条

MQTT保留消息的场景与副作用

保留消息由代理为每个主题保存最后一条,新订阅者订阅后立即收到,发布空载荷即可清除。它适合状态类数据,用来解决订阅方冷启动看不到当前状态的问题,但不适合当数据库使用。

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

保留消息解决冷启动

订阅方默认只能收到订阅之后发布的消息,设备刚上电或平台刚启动时看不到当前状态。保留消息为此设计:发布时置保留标志,代理为该主题保存这条消息,之后任何订阅该主题的客户端都会立即收到它;要清除,向同一主题发布一条空载荷的保留消息即可。

基本信息

存储位置代理侧按主题保存最后一条,与客户端会话无关
生效时机新订阅建立时立即下发,不等待下一次发布
清除方式向同一主题发布空载荷并置保留标志
常见搭配状态主题配保留消息,遥测主题只用普通消息
资源影响保留消息持续占用服务端内存或存储,需要设上限与过期策略

适用与不适用

数据类别是否适合保留原因
设备在线状态适合订阅方立刻知道当前状态,无需等待下一次上报
配置与固件版本适合变化频率低,冷启动即可读取当前值
高频遥测不适合每条都保留等于把最新值写满服务端,且价值有限
事件与告警不适合事件有先后顺序,保留最后一条会造成语义误解
历史数据不适合代理只保存最后一条,无法替代时序存储

典型使用场景

  • 监控大屏冷启动:订阅后立刻显示各设备当前状态,而不是空白等下一次上报
  • 设备状态同步:平台重启后马上恢复已知的设备在线状态
  • 临时诊断:用保留消息记录设备最近一次自检结果,便于随时查看
  • 配置下发确认:保留最近一次生效的配置版本,便于比对
保留消息的载荷最好带时间戳或序号,订阅方据此判断这条状态是刚刚更新还是几天前的残留,避免把过期状态当成实时状态。
用通配符订阅时,新客户端会在建立订阅瞬间收到大量保留消息,设备规模大时可能造成启动拥塞,需要评估订阅范围与服务端下发策略。

易错点

  • 把保留消息当数据库:代理只保存每个主题的最后一条,历史数据不会保留
  • 设备下线后忘记清除:订阅方长期收到残留状态,误判设备仍在线
  • 保留消息载荷不带时间戳:订阅方无法判断数据新鲜度
  • 对所有主题都开保留:服务端存储持续增长,且通配符订阅时产生下发风暴

数据来源与参考

  • OASIS MQTT Version 3.1.1 规范(保留消息章节)
  • OASIS MQTT Version 5.0 规范(保留消息与属性)

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

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