为什么升 5.0
MQTT 5.0 在 2019 年发布,解决了 3.1.1 一系列痛点:连接被拒只知道「失败」不知道为什么、订阅没法水平扩展、会话永久挂着。5.0 引入原因码、用户属性、共享订阅、流控,让 IoT 接入更可观测、更可扩展。
新建的 IoT 平台直接上 5.0。老设备还跑 3.1.1,broker 一般都能兼容两种版本并存。
MQTT 5.0 = 可观测、可扩展、可流控的发布订阅。
很多人在 3.1.1 上踩过坑:连接被拒只知道失败、订阅多了消息复制 N 份、设备断连后会话一直占着内存。MQTT 5.0 就是冲着这些痛点来的,新建平台直接用 5.0,老设备逐步迁移即可。
新建平台直接上 5.0,老设备还跑 3.1.1 也能在同一个 broker 上并存,不必一刀切。
新建平台直接上 5.0,老设备还跑 3.1.1 也能在同一个 broker 上并存,不必一刀切,按设备批次逐步迁移即可。
- 原因码失败返回具体原因。
- 共享订阅多消费者负载均衡。
- 过期会话与消息都能过期。
原因码与属性
CONNACK、SUBACK、PUBACK 都带原因码。比如 0x87 是「授权不足」,0x97 是「配额超限」。错误处理从「失败」变成「知道为什么失败」。用户属性还能在报文里带 key-value 元数据。
共享订阅
主题前缀 $share/group/topic。多个消费者订阅同一 group,broker 按轮询把消息分给其中一个。水平扩容消费端不再复制同一条消息。
# 三个消费者订阅同一个共享组
$share/grp/device/+/up
会话过期与消息过期
CONNECT 带 SessionExpiryInterval,设 3600 表示断开后 broker 保留会话 1 小时。PUBLISH 带 MessageExpiryInterval,消息过期自动丢弃。不再像 3.1.1 那样会话永久挂着。
流控与服务端能力
ReceiveMaximum、TopicAlias、MaximumQoS 让客户端和 broker 协商能力。慢消费者可以被 broker 限流,不会把内存打爆。CONNECT 返回 Broker 返回服务器支持的能力集。
- 原因码错误处理先 switch case。
- 共享订阅消费端水平扩展。
- 过期会话别永久挂。
- 流控慢消费者别压垮 broker。
升级注意
老客户端连 5.0 broker 一般兼容,但要确认 broker 配置开启 3.1.1 兼容。属性和原因码老客户端不识别时要降级处理。
小结与延伸阅读
MQTT 5.0 是 IoT 接入的新基准。新建平台直接用,老设备逐步迁。
- MQTT 安全读《MQTT 安全与设备管理实战》。
- 传感器上云读《传感器数据上云实战》。
- 网关架构读《物联网网关架构与边缘智能实战》。