MQTT QoS 服务质量等级

更新日期: 2021-07-05 阅读次数: 6107 字数: 627 分类: 物联网

在查看腾讯云 MQTT 相关接口时,看到一个参数 Qos:

服务质量等级,取值为0或1

什么是 QoS

Quality of Service,即服务质量。

看上去比较晦涩,找了本专门介绍 MQTT 的书《Hands-On Internet of Things with MQTT》才理解了。

QoS 给终端带来了一项重要的能力,即,可以接收自己离线时,对方发送的消息。例如,Facebook Messager 也是基于 MQTT 实现的消息机制。所以,本质上 MQTT 还是一个消息队列,MQ 已暴露了一切。。。

MQTT QoS 等级

MQTT 设计了 3 个 QoS 等级。

  • QoS 0:Fire and forget。消息最多传递一次,如果当时接收端不可用,则会丢失该消息。
  • QoS 1:Deliver at least once。消息传递至少 1 次。
  • QoS 2:Deliver exactly once。消息仅传送一次。

需要注意:publisher 与 subscriber 的 QoS 可以设置不同的等级

即:

  • publisher 与 broker 可以设置一个 QoS 等级。例如,QoS 等于 1 或 2,只能保证 broker 接收到消息,但是不能保证 subscriber 接收到消息。
  • 同理,subscriber 与 broker 之间也可以设置独立的 QoS

但我不确定我理解的是否正确,因为书里的描述,跟腾讯云的描述感觉对不上。。。

经测试确实如此:

如图,MQTT.fx 端订阅时可以指定 QoS:

MQTT.fx

而我的发布端则是另一个独立的 QoS (腾讯云 golang SDK):

request.Qos = common.Uint64Ptr(1)
response, err := client.PublishMessage(request)

但是,为什么腾讯云只支持 QoS 0 或者 1,而不支持 2 呢?

QoS 0 对 broker (即腾讯云实现的部分)压力最小,因为不需要记录消息是否收到。而 QoS 2 相对 QoS 1 需要的服务器资源相对更多,估计是基于这个考虑,所以大部分云服务器都不支持 QoS 2 吧。

阿里云、腾讯云、亚马逊云都只支持 QoS 0 和 1,不支持 QoS 2。

腾讯云 QoS 各等级详解

搜到了官方开发人员的一篇介绍:

https://cloud.tencent.com/developer/article/1801019

  • 服务质量:**特别注意,服务质量只针对PUBLISH控制包 (没太理解这里,难道订阅者就不支持了么?)。**腾讯云物联网支持 QoS 0 和 QoS 1(QoS2可在业务层做,比如在payload中增加去重标记)
    • QoS0:消息只发送一次
    • QoS1:消息发送后,需要接收到 PUBACK,不然一定间隔后会重新发送,次数和间隔取决于平台和设备端实现
      • 设备端:sdk 中会告知 QoS 1 消息是否到达或者超时失败,具体处理交给用户决定。在该系列后续的文章会提到,届时在此处补充链接。
      • 物联网服务平台:当 QoS 1 消息未收到 Puback 会以 3s 间隔重发,最多3次。(这里可以设置么?)

参考

  • https://www.emqx.cn/blog/introduction-to-mqtt-qos
  • https://cloud.tencent.com/developer/article/1801019

tags: 腾讯云 MQTT MQTT

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式