MQTT Broker 是否能够在一定时间内保留/缓存一些数据,然后发送给订阅者?

物联网 MQTT 发布订阅者
2021-06-05 07:12:46

我目前有一个 Mosquitto MQTT Broker,一些 IoT 节点在其上发布有关特定主题的信息。我有一个Telegraf来自 InfluxData的实例正在运行,它订阅了这个主题并将信息存储到InfluxDB.

要求

我了解一旦发布关于某个主题的信息将立即从经纪人发送给订阅者。我正在 MQTT Broker 中寻找一种保留或缓存机制,它可以等到主题上有 X 个数据点发布然后发送到订阅者。

标准 MQTT Brokers 中是否存在这样的机制,或者这是否超出了 MQTT 标准?

1个回答

不,这对于 MQTT 代理是不可能的。

有两种情况,代理会缓存给定主题上的消息。

  1. 当使用保留位设置发布消息时。此消息将在任何新消息之前存储并传递给订阅匹配主题的任何客户端。这是每个主题的一条消息,带有保留位的新消息将替换任何当前消息。

  2. 如果客户端具有持久订阅并且处于离线状态,则代理会将离线时发送的所有消息排队以在重新连接时进行传送(除非它在其连接数据包中将 cleanSession 位设置为 true)

实现您所描述的唯一方法是让另一个客户端批量处理消息并在不同的主题上发布集合。

编辑:

MQTTv5 规范支持在消息设置消息到期间隔值。

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

如果不存在,则应用消息不会过期。

服务器发送给客户端的 PUBLISH 数据包必须包含设置为接收值减去应用程序消息在服务器中等待的时间的消息到期间隔 [MQTT-3.3.2-6]。有关存储状态的详细信息和限制,请参阅第 4.1 节。