MQTT 协议定义了三种服务质量(Quality of Service, QoS)级别,用于在不同网络条件下保证消息的可靠传输。
QoS 0 - 最多一次(At most once)
- 特点:消息最多传递一次,不保证送达
- 确认机制:无需确认
- 适用场景:网络稳定、可以容忍消息丢失的场景
- 优点:开销最小,传输速度最快
- 缺点:可能丢失消息,不保证可靠性
QoS 1 - 至少一次(At least once)
- 特点:保证消息至少送达一次,但可能重复
- 确认机制:PUBACK 确认
- 流程:
- 发布者发送消息(PUBLISH)
- 接收者确认收到(PUBACK)
- 如果发布者未收到确认,会重新发送消息
- 适用场景:需要保证消息送达,但可以接受重复的场景
- 优点:保证消息送达
- 缺点:可能产生重复消息
QoS 2 - 恰好一次(Exactly once)
- 特点:保证消息恰好送达一次,既不丢失也不重复
- 确认机制:两阶段确认(PUBREC + PUBREL + PUBCOMP)
- 流程:
- 发布者发送消息(PUBLISH)
- 接收者确认收到(PUBREC)
- 发布者释放消息(PUBREL)
- 接收者完成确认(PUBCOMP)
- 适用场景:对消息可靠性要求极高的场景,如金融交易
- 优点:最可靠,保证消息不丢失不重复
- 缺点:开销最大,传输速度最慢
QoS 级别选择建议
- QoS 0:实时传感器数据、状态更新等可以容忍丢失的数据
- QoS 1:一般的消息通知、日志记录等需要保证送达的场景
- QoS 2:关键业务数据、支付指令、控制命令等不能容忍丢失和重复的场景
性能对比
| QoS 级别 | 消息开销 | 网络往返次数 | 可靠性 | 适用场景 |
|---|---|---|---|---|
| QoS 0 | 最小 | 1 | 低 | 可容忍丢失 |
| QoS 1 | 中等 | 2 | 中 | 需要送达 |
| QoS 2 | 最大 | 4 | 高 | 不能丢失重复 |
在实际应用中,需要根据业务需求、网络环境和性能要求来选择合适的 QoS 级别。