为什么升 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 上并存,不必一刀切,按设备批次逐步迁移即可。

5.0 三大新增
  • 原因码失败返回具体原因。
  • 共享订阅多消费者负载均衡。
  • 过期会话与消息都能过期。
MQTT 5.0 配图:中央一个发光的发布订阅消息总线枢纽方块,多台设备方块通过弧形发光波纹连到枢纽,枢纽上有双向箭头符号
中央枢纽连多台设备,双向箭头。

原因码与属性

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。