MQTT QoS 等级核心区别

MQTT QoS 等级核心区别 MQTT 协议定义了 3 个服务质量Quality of Service, QoS等级用于约定消息在发布者、消息代理Broker与订阅者之间的投递可靠性。等级越高可靠性越强但网络开销和延迟也同步上升。三个等级分别为QoS 0最多一次At most onceQoS 1至少一次At least onceQoS 2恰好一次Exactly once各等级详细说明1. QoS 0最多一次At most once投递保证消息最多投递 1 次发出后无任何确认机制不保证消息一定到达存在丢失风险。工作机制发布者仅发送 1 次PUBLISH报文Broker / 订阅者收到后直接处理不回复确认发布者发送后立即丢弃消息上下文不做重发。特点报文交互最少网络开销最低延迟最小无重传、无需报文 ID。适用场景对消息丢失不敏感的高频上报场景例如温湿度传感器周期上报、实时位置高频更新、非关键状态广播。2. QoS 1至少一次At least once投递保证消息至少投递 1 次保证消息不会丢失但可能出现重复投递。工作机制发布者发送带报文 ID 的PUBLISH报文并本地暂存消息等待确认接收方Broker / 订阅者收到消息后立即回复PUBACK发布确认报文若发布者超时未收到PUBACK会重发该消息报文标记DUP1。特点2 次报文交互开销中等网络波动时会产生重复消息业务层必须做幂等处理。适用场景要求消息必达、可接受少量重复的场景例如普通设备开关指令、通用通知消息、可通过唯一 ID 去重的数据上报。3. QoS 2恰好一次Exactly once投递保证消息恰好投递 1 次既不丢失也不重复是最高可靠性等级。工作机制通过四次报文交互、两阶段确认实现严格去重流程如下接收确认阶段发布者发送带报文 ID 的PUBLISH报文接收方收到后存储消息状态回复PUBREC发布收到发布者收到PUBREC后切换为等待释放状态。释放确认阶段发布者发送PUBREL发布释放报文接收方收到后正式处理消息如转发给订阅者清理状态并回复PUBCOMP发布完成发布者收到PUBCOMP后清理本地状态流程结束。任意环节超时未收到对应确认发布方都会重发对应报文通过报文 ID 保证消息仅被处理一次。特点4 次报文交互网络开销最高延迟最大协议层面保证消息不重复、不丢失。适用场景对消息准确性要求极高、重复 / 丢失会造成严重后果的场景例如支付计费指令、关键设备精准控制、金融 / 医疗类敏感数据传输。等级对比总表表格对比维度QoS 0最多一次QoS 1至少一次QoS 2恰好一次投递保证最多 1 次可能丢失至少 1 次不丢失可能重复恰好 1 次不丢失不重复核心报文PUBLISHPUBLISH PUBACKPUBLISH PUBREC PUBREL PUBCOMP交互次数1 次2 次4 次重传机制无超时重发 PUBLISH超时重发对应阶段报文网络开销极低中等高消息延迟最低中等最高业务幂等要求无必须处理重复消息协议层保证建议仍做幂等兜底关键注意事项QoS 降级规则最终投递 QoS 由发布者指定的 QoS和订阅者订阅时指定的 QoS取最小值决定。例如发布者以 QoS 2 发消息订阅者以 QoS 1 订阅则订阅者实际收到 QoS 1 等级的消息。分段生效非端到端QoS 是分段协商的发布者 ↔ Broker 按发布 QoS 交互Broker ↔ 订阅者按订阅 QoS 交互Broker 作为中间节点完成协议转换并非发布者与订阅者直接端到端协商。报文 ID 限制QoS 1 和 QoS 2 依赖 2 字节的报文 ID0-65535匹配确认报文高并发场景下需注意报文 ID 的复用与管理。