QoS1 MQTT 中的 PUBLISH 传递失败

Failed PUBLISH Delivery in QoS1 MQTT

我正在使用 moquette mqtt 代理,我正在尝试了解实现以及 MQTT 代理。个人项目希望对broker做一些修改

我很好奇当设备向代理发送 PUBLISH 消息时会发生什么,而代理无法将消息传递给订阅者。该协议表示将 PUBACK 发送回发布者。在 moquette 源代码中,这个 PUBACK 似乎是在将消息转发给任何订阅者之后发送的。

我把sendPubAck()函数注释掉了,模拟消息没有发布成功,所以我假设发布者会再次发布消息。但是,当我在传入消息处理函数旁边添加打印语句时,我只看到从发布者定期发送到代理的 PINGREQ 消息。我没有看到任何发布消息。

我的问题如下:客户端设备究竟如何决定何时重新发布消息?因为注释掉 sendPubAck() 函数似乎不会让发布者重新发送消息。

有两种选择。首先,您可以添加一个消息超时参数,以在未收到 PUBACK 时触发再次发送您的 PUBLISH。其次,您只能在重新连接时重新发送您的 PUBLISH。

我认为第二个选择是最好的选择。之所以如此,是因为经纪商(当然也可以是客户,取决于沟通方向)没有回应的可能原因。

  1. 您可能有一个有问题的代理,这实际上是您创建的
  2. 可能存在网络故障(连接丢失但未检测到),
  3. 代理可能过载。

对于第一种情况,除了修复代理之外,我们无能为力。对于第二种情况,客户端必须在重新连接时重试发布。对于第三种情况,发送重复的 PUBLISH 不会帮助代理响应,它只会进一步超载。

值得注意的是,在向发布客户端发送 PUBACK 之前,代理不应等待订阅客户端响应。