我知道M2MQTT不支持开箱即用的磁盘缓冲。但我需要实现这一点。这样做的目的是确保发布的所有消息实际到达代理。
现在,当我发布消息时,我的类直接将消息放入存储在磁盘上的键值数据库中。
在另一个线程中,方法循环键值数据库上的peek操作并查找要发布的消息。当在键值数据库中找到新消息时,线程调用M2Mqtt方法Publish,然后它直接在内部M2MQTT飞行队列中结束并返回发布ID。然后它在发布任何其他数据之前等待M2Mqtt事件MessagePublished,一旦调用该事件,它就将事件中的MessagePublished ID与从Publish方法接收的ID进行比较。如果它们相等,则知道该消息已成功发布。
总结:
在所有操作期间,线程1可能会排队很多消息,但是线程2只能逐个发布消息,以便在实际将消息从密钥中取出/删除之前验证消息是否已成功发布 - 值数据库并考虑发送。我需要按照从线程1中出现的顺序将它们发布到代理。
如果线程2只是通过键值数据库发布了从线程1传入的所有消息。尽管消息实际上没有到达代理,但线程2可能会从键值数据库中出列/删除值。它们可能位于RAM空中队列中,但服务器重新启动或服务重新启动会清空此队列,从而使消息完全丢失,因为线程2将它们从键值数据库中取出,而不实际验证它们是否已到达代理。
您能否就如何在M2Mqtt的最佳实践中实施该实施提供医学指导?这种模式是最佳实践吗?什么键值数据库更适合这种类型的实现?现在我尝试使用SqlCeCompact。
答案 0 :(得分:2)
当MQTT客户端重新启动时,您将遇到问题,因为编号也将被重置。 从我的角度来看,如果它对您至关重要,那么消息将按顺序保存,然后您需要使用时间戳。这是跟踪消息顺序和处理服务器上消息的唯一可能性。 发布到主题会限制您在主题中出现单个碎片。也许你最好使用基于队列的协议。