直接回答

当 MQTT 5 的运维语义能减少实际的应用工作时采用它:精确的 reason code、独立的会话过期、消息过期、请求/响应元数据、订阅标识符或协商的接收限制。当这些能力不改变运维决策时,MQTT 3.1.1 对稳定的存量设备仍然是合理选择。将采用视为兼容性迁移,而非一刀切的版本升级。

范围与边界

本比较覆盖影响设备集群和代理运维的协议行为。它不比较厂商的集群、存储引擎、仪表板或专有扩展。声称支持 MQTT 5 的代理可能同时服务两个版本,但不同监听器或 SDK 暴露的限制不同,因此支持声明不能替代互操作性测试。

MQTT 5 保留了 3.1.1 的发布/订阅模型和 QoS 级别。它的主要增加是结构化控制数据。CONNECT、CONNACK、PUBLISH、确认、SUBACK 和 DISCONNECT 可以携带属性或更精确的 reason code。这使故障可诊断、策略可表达,但也增加了报文大小、解析面和受限客户端上的状态。

从能力出发决策

选择一个有明确负责人和结果的功能。Message Expiry Interval 防止命令或瞬态遥测在离线队列中无限存活。Session Expiry Interval 将“启动时清除先前状态”与“状态应存活多久”分离,取代了 3.1.1 中过载的 clean-session 行为。Receive Maximum 和 Maximum Packet Size 让客户端声明入站限制,而非仅依赖协议外的配置。

Topic Alias 减少稳定连接上重复的主题字节,但两端必须正确管理连接作用域内的别名状态。Response Topic 和 Correlation Data 标准化了请求/响应元数据;它们不会将 MQTT 变成同步 RPC,也不保证响应方可用。Subscription Identifier 可以将投递归因于匹配的订阅。Server Keep Alive、Assigned Client Identifier 和 Server Reference 在客户端有意处理时改善了中心管理的连接行为。

当客户端资源严重受限、已部署设备集群无法安全更新、或平台约定已经无歧义地解决了相关问题时,继续使用 3.1.1。验证确切的代理、SDK、网关、代理、报文检查器和日志路径。一个丢弃属性的中继或一个只记录“连接失败”的客户端可能抹杀预期价值。

迁移步骤

  1. 按硬件型号、固件、SDK、网关和代理端点盘点协议版本。
  2. 选择一个具有可衡量运维价值的 MQTT 5 功能,如命令过期。
  3. 定义混合版本行为。属性不会自动翻译给 3.1.1 订阅者。
  4. 在旧消费者存在时,将必要的业务含义保留在负载中。
  5. 添加协商版本、连接和断连原因、被拒绝属性和大小失败的指标。
  6. 测试格式错误或重复属性、最大报文大小、接收限制、重连、代理重启和故障转移。
  7. 通过可逆的灰度发布上线,在恢复能力验证之前保留兼容的 3.1.1 路径。

失败模式

3.1.1 消费者无法接收 MQTT 5 属性。User Properties 如果不限制数量和字节数,可能成为无限制的元数据通道。意外的低 Receive Maximum 可能限制订阅者吞吐。Session Expiry 如果在未明确保留策略的情况下复制,会话状态可能超出产品预期。被重定向的客户端仍需信任验证和 Server Reference 的白名单。否定 reason code 必须传达给运维人员;将每个确认都视为成功会浪费 MQTT 5 的核心优势。

混合集群还会产生语义漂移。如果新发布者依赖 Message Expiry 而旧网桥在重发布时没有等效过期,过期数据可能重新出现。记录架构中每跳消耗、保留或丢弃了哪些属性。

实施清单

  • 迁移明确了能解决已定义问题的 MQTT 5 属性。
  • 每个客户端、网关、代理和诊断工具都已盘点。
  • 混合 3.1.1 和 5 的投递行为已文档化。
  • 混合运行期间必要的业务字段保留在负载中。
  • 属性数量、报文大小、接收最大值和会话过期有限制。
  • 否定确认和断连原因到达可观测性系统。
  • 回滚到 3.1.1 保留兼容的会话和消息状态。

需保留的证据

保留每个支持版本的一次成功和一次被拒绝连接的报文抓包、协商功能矩阵、混合版本集成结果和回滚记录。在每个结果中记录代理、客户端和网关版本。对于每个 MQTT 5 功能,说明 3.1.1 消费者看到的回退行为以及证明该功能正常工作的指标。当 SDK 或代理变更时重新运行这些用例,因为协议兼容的升级仍可能改变默认值、持久化、日志或属性限制。迁移仅在旧路径可以退役且不隐藏从未采用新版本的设备时才算完成。

主要参考来源

对比规范性的 MQTT 3.1.1 规范MQTT 5.0 规范。OASIS 文档定义了线路行为。代理和 SDK 文档对于监听器配置、持久化限制、降级行为以及通过日志和指标暴露的 reason code 仍然必不可少。