是否有允许消息日志和保留消息 TTL 的 MQTT 服务器?

物联网 MQTT
2021-06-07 05:54:52

对于我的家庭设置,我使用 mosquitto 作为 MQTT 代理。它运行良好,提供典型的 MQTT 服务。

缺少两个功能

  • 记录发送给代理的所有消息(带有时间戳)
  • 一段时间后使保留的消息过期

第一个可以通过编写一个帮助程序(执行此操作的代码示例)来收集所有消息(通过订阅#)并自行记录它们。不过,拥有这个内置功能会很好。

第二个必须在服务器本身上实现,因为它是唯一知道消息设置了保留标志的服务器。我知道我在服务器的描述中看到了这种能力,但我再也找不到它了(从记忆中,有一个警告说这是非标准行为,并且可以将 TTL 设置为数天、数周、数月或数年)

3个回答
  1. HiveMQ提供了一个日志插件 iirc 并且在Mosca 中使用回调来实现它应该是微不足道的。

  2. Mosca 在其内存/升级持久层上支持 ttl

除了 hardillb 对 Mosca 的建议,HiveMQ 3.3+ 还列出了 TTL 作为一个特性:

HiveMQ 在 MQTT 生命周期的各个级别引入了生存时间 (TTL)。还支持自动清除过期消息以及擦除废弃的持久 MQTT 会话。特别是,3.3 版实现了以下 TTL 功能:

  • MQTT 客户端会话过期
  • 保留消息到期
  • MQTT PUBLISH 消息过期

我相信新的 MQTT 5 规范也旨在通过 PUBLISH 数据包上Message Expiry Interval属性支持消息到期

如果存在,则四字节值是以秒为单位的应用程序消息的生命周期。如果消息过期间隔已经过去,并且服务器还没有设法开始向匹配的订阅者继续传递,那么它必须删除该订阅者的消息副本 [MQTT-3.3.2-5]。

第 3.3.1.3 节(保留)中指出:

如果某个主题的当前保留消息过期,则它会被丢弃,并且该主题将没有保留消息。

从这个描述来看,听起来 MQTT 5 将支持保留消息到期。MQTT 5 代理不如当前的 MQTT 3.1.1 代理成熟,但在几个月后,您当然应该能够找到一个 MQTT 5 代理,它将以符合标准的方式(而不是专有扩展)支持 TTL . 与此同时(或者如果您坚持使用 MQTT 3.1.1),您需要查看其他建议。

flespi MQTT 代理支持 MQTT 5.0,并将保留消息过期超时作为其中的一部分。

同时根据您问题的第一部分,flespi 代理为其收到的每条消息添加了特殊的时间戳属性这意味着,如果你使用任何类型的MQTT 5.0的使能端(mqtt.js对javascript和gmqtt的蟒蛇正在生产中的话),它订阅“#”后,你可以存储的经纪人看到它在消息发布的确切时间你自己的数据库。如果使用 MQTT 3.X 协议发布消息但通过 5.0 接收消息,这也将起作用。