有没有办法为 MQTT Broker 中的消息提供 TTL

ena*_*tor 3 mqtt paho emq

在 MQTT 规范中,有一些连接标志用于管理服务器和客户端上的保留和状态。

干净会话规范建议:

3.1.2.4 清理会话位置:连接标志字节的位 1。

该位指定会话状态的处理。客户端和服务器可以存储会话状态,以使可靠的消息传递能够在一系列网络连接中继续进行。该位用于控制会话状态的生存期。

如果 CleanSession 设置为 0,服务器必须根据当前会话的状态(由客户端标识符标识)恢复与客户端的通信。如果没有与客户端标识符关联的会话,服务器必须创建一个新会话。客户端和服务器断开连接后,客户端和服务器必须存储会话[MQTT-3.1.2-4]。

在 CleanSession 设置为 0 的会话断开连接后,服务器必须存储与断开连接时客户端拥有的任何订阅相匹配的进一步 QoS 1 和 QoS 2 消息,作为会话状态的一部分

因此,每当客户端在断开连接后再次连接时,代理都会中继所有未确认的 QoS-1 和 QoS-2 消息。所以,经纪人有一个状态。为了维护每个客户端的状态,服务器将使用一些数据库进行保留。有没有办法为这些消息状态(服务器将存储的)提供生存时间。如何告诉代理丢弃(即不转发)任何早于以下时间的消息;假设5天。

基本上,我们希望使用 clean session = 0 和 QoS-1;但如何清除旧消息的代理状态?不想接收超过 5 天的旧消息,即使未确认也是如此。

And*_*rew 5

MQTT 5.0 允许设置发布消息过期间隔。

https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901112

3.3.2.3.3 消息过期时间间隔

2 (0x02) 字节,消息到期间隔的标识符。

接下来是代表消息到期间隔的四字节整数。

如果存在,四字节值是应用程序消息的生命周期(以秒为单位)。如果消息过期间隔已过,并且服务器尚未成功开始向匹配订阅者转发,则它必须删除该订阅者的消息副本 [MQTT-3.3.2-5]。

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

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