MQTT - 对于更大的有效载荷,QOS 级别 2 是否更好?

问题描述 投票:0回答:1

QOS 0/1 可能会多次重发消息。

对于大负载,QOS 2 是否更好,因为它确保负载只发送一次?

QOS 2 有额外的来回,但我假设发送的是有效载荷的校验和,而不是有效载荷本身。

因此我的想法是,一点点额外的网络通信比冒着多次发送大量有效负载的风险要好

mqtt
1个回答
0
投票

QOS1 和 QOS2 之间的区别更多在于确保消息只被接收方处理一次。考虑在每个级别发送的数据包:

QOS1 - PUBLISH -> PUBACK
QOS2 - PUBLISH -> PUBREC -> PUBREL -> PUBCOMP

因此,无论哪种情况,如果在收到初始确认(

PUBACK
/
PUBREC
)之前与代理的连接丢失,则需要重新发送完整消息(包括有效负载)。所以在
QOS2
操作并不能保证消息不会多次通过网络链接传输。

QOS1
,一旦
PUBACK
被发送,
MessageID
就可以重复使用;因此,如果收到带有该 ID 的消息,您无法可靠地判断它是否重复(
DUP
标志提供提示但不是完整的解决方案)。

QOS2
操作时,您等到收到
PUBREL
,然后忘记
MessageID
PUBREL
基本上是说“我已经收到您的
PUBREC
并且不会重新发送该消息);这意味着您可以保证该消息只会被处理一次。

鉴于 MQTT 在 TCP 上运行(它提供自己的保证)

QOS2
将产生比
QOS1
(假设相同的消息内容和链接条件)更多的网络流量。

但是,如果代理收到重复的

QOS1
消息,可能会产生额外的流量,因为它会将这些消息传递给任何订阅者(而在
QOS2
,代理将检测到重复并只发送一个副本)。这意味着答案将取决于您的情况(消息通过什么链接,它的独特性对接收者是否重要,接收者是否可以通过其他方式检测重复等)。

请注意,以上假设消息将在连接断开时重新发送;这是 MQTTv5 规范所要求的。 MQTTv3 允许在其他时间重新发送消息,但我相信大多数经纪人现在都遵循 v5 标准。

© www.soinside.com 2019 - 2024. All rights reserved.