【发布时间】:2015-08-13 05:29:29
【问题描述】:
我们在位置 A 有 Mosquito 代理,而 Rabbit MQ 在云中。我们已经连接了两个经纪人。 Mosquito 中配置的 Topic 中的数据正在 Rabbit MQ 中的 AMQ.Topic 中发布。
如果连接丢失,在重新建立连接后,Mosquito broker 上可用的数据是否会被传递。
在开发此类解决方案时我们应该牢记哪些事项?
【问题讨论】:
我们在位置 A 有 Mosquito 代理,而 Rabbit MQ 在云中。我们已经连接了两个经纪人。 Mosquito 中配置的 Topic 中的数据正在 Rabbit MQ 中的 AMQ.Topic 中发布。
如果连接丢失,在重新建立连接后,Mosquito broker 上可用的数据是否会被传递。
在开发此类解决方案时我们应该牢记哪些事项?
【问题讨论】:
这取决于您如何配置网桥。
一般来说,MQTT 客户端有两种类型,durable/persistent 或 non-durable/non-persistent强>。这是在连接时使用 clean session 标志控制的。
当持久客户端连接时(干净会话设置为 0),代理将在断开连接后维护有关该客户端的信息。这意味着该客户端的订阅以及可能在重新连接时准备好发送的消息(使用相同的客户端 ID!)
默认情况下,根据 MQTT 规范,如果订阅和消息都使用大于 0 的 QoS,则消息只会为断开连接的持久客户端排队。Mosquitto 提供了将所有消息排队的功能,但这不是规范涵盖,因此您不能将其依赖于其他经纪人。
还有其他注意事项 - 只有有限数量的消息会排队等待离线客户端。这可以在 mosquitto 上使用max_queued_messages 选项进行配置。
当非持久客户端(clean session 设置为 1)连接时,服务器在断开连接后将不会保留有关该客户端的任何信息。
如果客户端连接为持久版本,然后重新连接为非持久版本,则一旦非持久版本连接,所有存储的信息将被删除。
同样的原则也适用于网桥,因此您需要将网桥配置为持久的(干净的会话 0),并为您的消息使用 QoS>0。您还需要确保最大排队消息适合您的需要。
【讨论】: