九月做了一次升级,把设备网关的协议版本从 MQTT 3.1.1 升到 5.0。做之前评估了两个月,因为涉及在网设备的兼容。
先说服自己:3.1.1 也能用,为什么要升。最后理由有三个,都在运维侧。
一是原因码。3.1.1 的应答只有成功和失败两种,设备连不上你根本不知道为什么。5.0 带了详细原因码,是认证失败、权限不足还是服务不可用,一眼看得出来。这一条就值回票价,我们的平均排障时长从四十多分钟降到十几分钟。
二是共享订阅。以前多个消费端要自己做负载均衡,谁挂了消息就堆在谁那儿。5.0 原生支持共享订阅,多个同名订阅者轮流收,服务扩缩容不用改业务代码。
三是消息过期。物联网里最有价值的消息是刚刚那一条,比如设备的最新状态。设备离线时堆在队列里的旧消息,重连后一股脑推过来,除了浪费带宽没别的用。5.0 可以给消息设过期时间,过期的直接丢。
兼容是这么做的:网关做双版本支持,新固件默认走 5.0,老设备继续走 3.1.1,按型号分批灰度。计划是等 3.1.1 的连接占比降到个位数,再把老分支下线——按现在的设备存量,这一步估计要等大半年。
经验是:协议升级的收益经常不在性能上,在可观测性上。性能提升你感知不到,排障时间省一半是每天都感知得到的。