M2Mqtt消息缓冲

时间:2017-03-15 07:36:41

标签: c# multithreading persistence mqtt iot

我知道M2MQTT不支持开箱即用的磁盘缓冲。但我需要实现这一点。这样做的目的是确保发布的所有消息实际到达代理。

现在,当我发布消息时,我的类直接将消息放入存储在磁盘上的键值数据库中。

在另一个线程中,方法循环键值数据库上的peek操作并查找要发布的消息。当在键值数据库中找到新消息时,线程调用M2Mqtt方法Publish,然后它直接在内部M2MQTT飞行队列中结束并返回发布ID。然后它在发布任何其他数据之前等待M2Mqtt事件MessagePublished,一旦调用该事件,它就将事件中的MessagePublished ID与从Publish方法接收的ID进行比较。如果它们相等,则知道该消息已成功发布。

总结:

  1. 线程1将消息排入键值数据库
  2. 线程2在键值数据库队列
  3. 上运行一个peek循环
  4. 主题2找到新消息
  5. 线程2调用M2Mqtt发布并从发布方法
  6. 接收ID1
  7. 线程2暂停并等待MessagePublished事件并检查发布的ID是否等于ID1,如果是这种情况,则键值数据库队列出列一次,此时消息被认为已成功发送
  8. 线程2继续其循环,如步骤2所示,寻找要发布的新消息。
  9. 在所有操作期间,线程1可能会排队很多消息,但是线程2只能逐个发布消息,以便在实际将消息从密钥中取出/删除之前验证消息是否已成功发布 - 值数据库并考虑发送。我需要按照从线程1中出现的顺序将它们发布到代理。

    如果线程2只是通过键值数据库发布了从线程1传入的所有消息。尽管消息实际上没有到达代理,但线程2可能会从键值数据库中出列/删除值。它们可能位于RAM空中队列中,但服务器重新启动或服务重新启动会清空此队列,从而使消息完全丢失,因为线程2将它们从键值数据库中取出,而不实际验证它们是否已到达代理。

    您能否就如何在M2Mqtt的最佳实践中实施该实施提供医学指导?这种模式是最佳实践吗?什么键值数据库更适合这种类型的实现?现在我尝试使用SqlCeCompact。

1 个答案:

答案 0 :(得分:2)

当MQTT客户端重新启动时,您将遇到问题,因为编号也将被重置。 从我的角度来看,如果它对您至关重要,那么消息将按顺序保存,然后您需要使用时间戳。这是跟踪消息顺序和处理服务器上消息的唯一可能性。 发布到主题会限制您在主题中出现单个碎片。也许你最好使用基于队列的协议。