MQTT追赶错过的消息,寻找有关设计/假设的反馈

时间:2017-09-15 00:10:44

标签: mqtt

我想对这个问题提出一些反馈意见以及我提出的解决方案,以便在错过MQTT消息之后赶上:

[更新1] 简化问题图并添加解决方案图。添加了QoS

情境:

客户端A发布我们希望客户B接收的消息,即使临时丢弃连接然后恢复。

配置

  • 客户端A:使用clean = false连接。使用retain = false
  • 发布retain = true,非有状态消息发布有状态消息
  • 客户B:连接clean = false

enter image description here

将会发生什么

每次客户A发布主题“foo”时,以前的消息都会在代理上替换。防爆。客户A发布111222333。客户端B在发布消息后连接。客户B将仅收到333。因此,错过了111222消息,因为每个消息都替换了同一主题上的前一个消息(不同的主题不会相互替换)。

建议的解决方案

我设想了两种类型的消息。有状态和无状态。有状态的消息可能是电压,温度,gps位置,压力等。非有状态消息就像聊天消息,其中历史对于上下文更有可能是重要的。错过的有状态消息更可能是可容忍的,而非有状态消息可能是不可容忍的。

在我的案例中,所有消息都以QoS 1发布。

对于有状态消息,我认为客户端A将使用retain = true发布。

对于非有状态消息,我认为客户端A将使用retain = false发布(因为如果我们没有先前消息的完整历史上下文,那么最后一条消息会有什么好处)。当客户端B连接/重新连接时,我将发布一个追赶(任意名称)消息,其中包含它收到的所有消息的ID,当客户端A收到它时,它将通过发布消息的整个历史记录减去id中的消息来响应list(在客户端A db中维护的ID)。如果总聚合邮件历史记录不是太大,这可能对我有用。

enter image description here

备选方案可能是客户B为收到的每封邮件发送已读回执。

对我来说,这两个解决方案需要一个消息数据库和一些自定义逻辑

这是this one的一个跟进问题,我尝试回答这个问题但被要求将其形成为一个独立的后续问题。

0 个答案:

没有答案