QoS

Quality of Service 服务质量

定义

QoS(Quality of Service)在 MQTT 等协议中表示消息投递质量等级:QoS 0 至多一次、QoS 1 至少一次、QoS 2 恰好一次。设备管理平台根据业务需求配置 QoS,平衡可靠性与性能。

QoS 等级与选型

MQTT QoS 0 为「发即忘」,无确认与重传,适合高频遥测等可容忍丢失的场景;QoS 1 通过 PUBACK 确认至少投递一次,可能重复,适合告警、Downstream Command 下行指令等;QoS 2 通过四步握手保证恰好一次,开销最大,适合关键控制、支付类指令。设备管理平台需根据消息类型配置:遥测可用 QoS 0,控制与配置建议 QoS 1 或 2;同时考虑网络不稳定时的重试与去重策略。

与 DMP 的集成

平台在设备接入、规则引擎、消息路由等环节支持 QoS 配置。设备端与平台端 QoS 取两者较小值生效;持久会话与 Clean Session 影响离线消息的保留与投递。大规模设备场景下,QoS 1/2 会增加 Broker 负载与延迟,需结合 MQTT 集群、消息队列等架构设计,在可靠性与吞吐间取得平衡。

应用场景

适用于 OTA 升级包下发(QoS 1)、远程控制指令(QoS 1)、关键告警(QoS 1)、高频传感器数据(QoS 0)等。合理配置 QoS 是保障物联网通信可靠性与效率的基础。

三个投递等级实际保证什么

服务质量等级约束的是“这一条消息如何被确认”,不是通道永远不丢、也不等于业务只执行一次。等级 0 发出后不等确认,链路抖动时样本可以消失,适合可以靠下一条覆盖的周期量。等级 1 至少要收到一次确认,发送方在超时后会重传,因此同一条内容可能到多次。等级 2 用多步握手把“已经送达”和“不会再重传”分开,网络往返明显更多,只适合不能靠接收方自行去重的关键指令。

选级时先看接收方能不能识别重复。遥测点如果带时间戳和序号,重复样本可以丢弃,用等级 1 换可靠性通常划算;没有序号的控制指令,重复投递会变成重复执行,这时才需要考虑等级 2,或者在业务层为每条指令分配一次性标识。把所有上行都调到最高等级,只会放大握手次数,并不能弥补设备时钟不准或应用层没有幂等设计。

会话保持与离线积压同时存在时

等级只在会话和队列策略允许时才有意义。清理会话后,离线期间的消息不会被保留,等级 1 的确认机制也无从补发。持久会话加上过长的离线,又会把积压一次性推给刚上线的设备,升级包、告警和普通采样挤在同一条连接上。使用条件是:需要补发的消息单独排队,并限制条数和保存时间;过期的周期采样直接丢弃,只保留仍影响当前状态的指令和告警。

高频遥测不适合进持久会话的补发队列。设备断线几小时再上线时,补的是过期曲线,却堵住了当前的控制回执。队列应按主题分开,采样类允许丢旧留新,指令类按标识保留到确认或超时。平台侧若把订阅等级设得比发布更高,多出来的确认等级并不会被发送方执行,排障时要看实际生效的那一档,而不是配置界面上各自填写的数字。

两端等级不一致时的静默降级

发布和订阅取较低等级生效,这是协议行为,不是故障。控制台把下行配成等级 1,设备订阅仍是等级 0,消息会按等级 0 送出且没有确认。界面若只显示平台侧配置,运维会以为指令有确认,实际上设备重启前的那条可能已经丢失。下发远程控制前应核对设备连接时协商的有效等级,而不是只看产品默认值。

另一类错误是用等级 2 代替应用层去重。握手保证的是“这一次发布不会无限重传”,设备若在执行之后、回写结果之前掉电,应用仍可能再收一条相同业务指令。关键动作应带指令标识,设备记录已执行的标识,重复到达则只回放上一次结果。反过来,把告警也按等级 0 发送,会在弱网下静默丢失,而平台以为“没有告警就是正常”。告警至少应能被确认或由下一条状态覆盖,不能靠“没收到就当没发生”。

排障时把一条消息的生命周期记全:发布方选择的等级、会话是否保留、有没有进入离线队列、订阅方实际生效的等级、以及应用有没有按标识丢掉重复。少记任何一段,都会把协议降级误判成设备故障,或者把重复执行误判成网络重传。变更默认等级属于接入配置变更,应先在少量设备上观察确认次数和流量,再扩大到整个产品。观察期内同时看队列深度,避免高等级消息把低等级采样完全挤出链路。等级变更后抽查几台离线再上线的设备,确认积压队列没有把过期采样一次性补进规则。

相关术语

返回设备管理平台专业术语