我想记录经纪人的所有 mqtt 消息。我应该如何设计数据库模式。避免重复条目和快速搜索

I want to log all mqtt messages of the broker. How should I design schema of database. Avoiding dulplicate entries and fast searching

我正在 java 中实现回调以将消息存储在数据库中。我有一个订阅“#”的客户。但问题是,当此客户端断开连接并重新连接时,它会在保留消息的数据库中添加重复条目。如果我搜索以前的条目,更大的 tables 在计算能力方面会很昂贵。所以我应该为每个传感器或每个经纪人分配一个单独的 table。如果您建议我更好的设计,我将不胜感激。

使用单个客户端订阅通配符绝对是一种反模式。原因是:

  1. 通配符订阅者获得 MQTT 代理的 所有 条消息。大多数客户端库无法处理该负载,尤其是在转换/持久化消息时。
  2. 如果您的通配符订阅者死亡,您丢失消息(除非经纪人无休止地为您排队,这也不起作用)
  3. 您的系统基本上存在单点故障。使用经过强化以供生产使用的 MQTT 代理。这些是比您的手写客户端更强大的单点故障。 (不过,您可以通过集群和负载平衡来克服 SIP)。

所以为了解决这个问题,我建议如下:

  • 使用可以处理共享订阅的代理(如 HiveMQ 或 MessageSight),这样您就可以平衡多个客户端之间的所有消息
  • 使用自定义插件在代理而不是客户端进行持久化。

您还可以在此处阅读有关该主题的更多信息:http://www.hivemq.com/blog/mqtt-sql-database

同时考虑对所有消息使用 QoS = 3 以确保仅传递一封消息。如果不满足 QoS 要求,您还可以考虑为每条消息添加时间戳,以避免插入重复的消息。