【问题标题】:What is the use/purpose of MQTT QoS?MQTT QoS 的用途/目的是什么?
【发布时间】:2017-01-09 17:11:06
【问题描述】:

我正在研究 MQTT 协议,似乎规范的第一行存在矛盾:

协议通过 TCP/IP 或其他网络协议运行 提供有序、无损、双向连接。它的特点 包括:

[...]

三种服务质量 消息传递:

  • “最多一次”,其中消息位于 根据操作环境的最大努力交付。 可能会发生消息丢失。例如,可以使用此级别 环境传感器数据,个人读数无关紧要 由于下一个将很快发布,因此丢失了。 ·
  • “在 至少一次”,其中消息可以保证到达,但重复的可以 发生。 ·
  • “恰好一次”,保证消息到达 恰好一次。例如,此级别可用于计费 重复或丢失消息可能导致不正确的系统 正在收取费用。

如果 MQTT 只能在无损的网络协议上运行,那么提供有损级别的 QoS(级别 0)是什么意思?

我相信它甚至不可能提供,因为 TCP 协议将负责重新传输丢失的消息。这对于旨在在非 TCP、不可靠网络上运行的 MQTT-SN 来说是有意义的。

(备注:使用 TCP 协议时,级别 1“至少一次”没有意义,因为 TCP 已经包含此保证,但在更一般的情况下可能有意义,因为规范说可以使用其他无损协议)

【问题讨论】:

    标签: tcp mqtt qos


    【解决方案1】:

    严格来说,在 TCP/IP 层得到确认的 TCP 帧并不一定意味着,在应用层,任何需要对数据包执行的操作都已有效完成。

    在丢失 MQTT QoS 0 数据包的情况下,可能发生的情况是 TCP 数据包到达代理(即从客户端的角度来看确实是 ACK),但代理在中间崩溃将消息传递给所有订阅的客户端。

    假设您有 100,000 个客户端订阅了 MQTT 主题 - 将数据转发给订阅的客户端需要一段时间,并且代理可能会在此过程中死亡。从发布者的角度来看,消息确实已发布到代理,但确实存在消息丢失,因为某些订阅者永远不会听到该消息。

    【讨论】:

    • 如果实现 MQTT 的程序在向客户端传递消息的过程中崩溃了,MQTT 如何保证传递?此时,主机上的所有消息记录都将丢失。
    • @tweej 我相信这就是持久会话有用的地方。 MQTT 客户端将存储任何未确认/未确认的 QoS 1/2 发布,直到代理重新联机。届时,将进行另一次发布尝试。
    猜你喜欢
    • 2013-06-20
    • 2019-05-24
    • 2015-10-03
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2017-10-15
    相关资源
    最近更新 更多