QoS 是分段承诺
QoS 描述的是客户端与代理之间这一段连接上的投递保证。发布方向代理发送、代理向订阅方转发,是两次独立协商,订阅方最终收到的等级取发布消息的 QoS 与订阅时请求的 QoS 中较小的那个。等级越高,握手报文越多、需要的存储与内存越大,吞吐下降也越明显。
三级对照
| 等级 | 语义 | 交互 | 代价 |
|---|---|---|---|
| QoS 0 | 至多一次,可能丢失 | 单向发布,无确认 | 开销最小,适合高频遥测 |
| QoS 1 | 至少一次,可能重复 | 发布与确认两步 | 需要应用侧去重 |
| QoS 2 | 恰好一次,不重复不丢失 | 发布、接收、释放、完成四步握手 | 延迟与存储开销最大,吞吐下降明显 |
等级如何生效
等级如何生效
# 发布侧指定 QoS:0 只发一次,链路异常即丢
# QoS 1:等待确认报文,未收到时重发同一条消息
# QoS 2:四步握手,确认接收后再释放报文标识
# 订阅侧请求 QoS 1,而发布侧使用 QoS 0,订阅方实际收到 QoS 0
# 会话保持会保存未确认的 QoS 1 与 QoS 2 消息,QoS 0 不保存典型使用场景
- 周期性遥测:数值会被下一条覆盖,可用 QoS 0 换取吞吐与电量
- 告警与状态变更:不允许静默丢失,至少用 QoS 1 并做去重
- 计费与结算类数据:需要严格不重复,配合平台侧主键做幂等
- 离线补传:依赖持久会话与 QoS 1 把断线期间的消息补发出去
QoS 1 的重复来自重发机制:确认报文丢失时发布方会重发同一条消息,接收方需要靠报文标识或业务主键判重。
全链路使用 QoS 2 是与吞吐量直接冲突的选择,只有在重复交付的代价确实高于吞吐损失时才值得使用。