当消息以QoS=1发布时会发生什么?



我想更好地理解这个库的行为。具体来说:假设我与MQTT服务器有一个打开的连接(通过WSS,如果这会改变什么的话)。我发布一条QoS=1的消息。我的理解是mqtt等待PUBACK消息。接收到ack后,将调用done回调并结束流。我不清楚的是底层的东西:多少"时间";图书馆等着你回来吗?如果回不来怎么办?消息被重发了?连接已关闭/重新打开?别的吗?这个行为是可调的吗?

在回答你的具体问题之前,我觉得有必要概述一下协议的要求(我将突出显示关键术语)。MQTT 3.1.11规范说:

当客户端重新连接时,清洗设置为0,客户端和服务器都必须重新发送任何未确认的PUBLISH数据包(QoS>0)和PUBREL数据包使用其原始数据包标识符[MQTT-4.4.0-1]。这是唯一的情况重新发送消息。

v5规范收紧了这一点:

当客户端在Clean Start设置为0并且存在会话时重新连接时,客户端和服务器都必须重新发送任何未确认的PUBLISH数据包(QoS>0)和PUBREL数据包使用其原始数据包标识符。这是客户端或服务器需要重新发送消息的唯一情况。客户端和服务器不能重发[MQTT-4.4.0-1].

所以规范只要求在客户端重新连接时重新发布。v3.1.1不禁止在其他时间重发,但我不建议这样做(更多信息请参阅此回答)。

特别关注mqtt.js,我已经扫描了代码,我能看到的唯一重新发送机制是建立连接时(由此问题备份)。因此,为了回答您的具体问题:

多少"时间"图书馆等着你回来吗?

没有限制;存储回调,并在流完成时调用(例如)。

如果回不来怎么办?消息被重发了?连接已关闭/重新打开?别的吗?

。然而,在现实中,使用TCP/IP意味着,如果消息没有传递,那么连接应该断开(如果代理接收到消息,但无法处理它,那么它应该真正断开连接)。

此行为可调吗?

我猜你可以实现定时重发,但这不太可能是一个好主意(这样做会违反v5规范)。更好的方法可能是,如果消息在设定的时间范围内未得到确认,则断开连接。然而,真的没有必要这样做。

最新更新