MQTT协议中的“通知级别”通常指其QoS(服务质量,Quality of Service)等级。它定义了消息从发布者到接收者的可靠性保证,而非直观的“优先级”。
MQTT一共定义了三个QoS等级,核心区别如下:
| 等级 | 英文标识 | 保证机制 | 消息可能丢失 | 消息可能重复 |
|---|---|---|---|---|
| 0 | 至多一次 | 即发即弃,无确认 | ✅ 是 | ❌ 否 |
| 1 | 至少一次 | 确认与重发机制 | ❌ 否 | ✅ 是 |
| 2 | 恰好一次 | 四次握手流程 | ❌ 否 | ❌ 否 |
三个等级的具体工作方式和适用场景如下:
📡 QoS 0:至多一次
- 工作机制:消息发送方将消息发送出去后,不关心对方是否收到,也不进行任何重试。这就像寄出一封平信,不确认对方是否收到。
- 适用场景:适合数据量较大、对实时性要求高,但允许偶尔丢失少量数据的场景。例如,每分钟上报一次的温湿度传感器数据,偶尔丢一两个数据点影响不大。
🤝 QoS 1:至少一次
- 工作机制:消息发送后,发送方会等待接收方的确认(
PUBACK)。如果在一段时间内没有收到确认,发送方会重发消息,直到收到确认为止。这类似于寄挂号信,确保对方能收到,但对方可能会收到多封相同的信。 - 适用场景:适用于需要确保消息送达,且能够容忍重复处理的场景。例如,远程控制智能开关的指令,可以接受发送两次“开灯”指令(虽然灯已经是开的),但不能接受指令丢失导致灯没开。
⚙️ QoS 2:恰好一次
- 工作机制:这是最高级别的可靠性保障,通过四次握手的复杂流程,确保消息既不丢失也不重复。这个机制最可靠,但带来的性能开销和延迟也最大。
- 适用场景:适用于对消息的准确性和唯一性要求极其严格的场景。例如,金融交易、计费系统或关键的控制命令,消息的重复或丢失都可能导致严重问题。
💡 重要补充:QoS ≠ 优先级
需要明确的是,QoS定义的是可靠性,而不是我们通常理解的“优先级”。
- 高QoS不等于高优先级:一个QoS 2的消息虽然在传输上更“重”(流程更复杂),但不代表它会被服务器(Broker)优先处理。
- 真正的消息优先级:MQTT协议本身没有定义消息优先级字段。如果需要实现优先级,通常需要在应用层自行设计(如为不同优先级的消息分配不同的主题,或自定义消息头)。
如果还想了解某个QoS等级的具体交互流程(比如QoS 2的四次握手),或者想深入探讨如何在实际项目中处理消息重复的问题,随时可以告诉我。
文档更新时间: 2026-06-07 02:34 作者:月影工作室