我想对这个问题提出一些反馈意见以及我提出的解决方案,以便在错过MQTT消息之后赶上:
[更新1] 简化问题图并添加解决方案图。添加了QoS
情境:
客户端A发布我们希望客户B接收的消息,即使临时丢弃连接然后恢复。
配置
将会发生什么
每次客户A发布主题“foo”时,以前的消息都会在代理上替换。防爆。客户A发布111
,222
,333
。客户端B在发布消息后连接。客户B将仅收到333
。因此,错过了111
和222
消息,因为每个消息都替换了同一主题上的前一个消息(不同的主题不会相互替换)。
建议的解决方案
我设想了两种类型的消息。有状态和无状态。有状态的消息可能是电压,温度,gps位置,压力等。非有状态消息就像聊天消息,其中历史对于上下文更有可能是重要的。错过的有状态消息更可能是可容忍的,而非有状态消息可能是不可容忍的。
在我的案例中,所有消息都以QoS 1发布。
对于有状态消息,我认为客户端A将使用retain = true发布。
对于非有状态消息,我认为客户端A将使用retain = false发布(因为如果我们没有先前消息的完整历史上下文,那么最后一条消息会有什么好处)。当客户端B连接/重新连接时,我将发布一个追赶(任意名称)消息,其中包含它收到的所有消息的ID,当客户端A收到它时,它将通过发布消息的整个历史记录减去id中的消息来响应list(在客户端A db中维护的ID)。如果总聚合邮件历史记录不是太大,这可能对我有用。
备选方案可能是客户B为收到的每封邮件发送已读回执。
对我来说,这两个解决方案需要一个消息数据库和一些自定义逻辑
这是this one的一个跟进问题,我尝试回答这个问题但被要求将其形成为一个独立的后续问题。