12

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

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

[...]

消息传递的三种服务质量:

  • “最多一次”,根据操作环境的最大努力传递消息。 可能会发生消息丢失。例如,此级别可用于环境传感器数据,其中单个读数是否丢失并不重要,因为下一个读数将很快发布。·
  • “至少一次”,确保消息到达但可能发生重复。·
  • “Exactly once”,保证消息只到达一次。例如,此级别可用于重复或丢失消息可能导致应用不正确费用的计费系统。

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

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

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

4

1 回答 1

19

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

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

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

于 2016-09-01T18:01:55.987 回答