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

问题描述 投票:0回答:1

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

干净的会议specification建议:

3.1.2.4清除会话位置:Connect Flags字节的第1位。

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

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

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

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

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

mqtt paho emq
1个回答
2
投票

简短的回答,你不能(同时保持在规范内)。

根据规范,客户端的持久状态需要无限期保留。

您没有提到您正在使用哪个经纪人,但mosquitto确实有以下(无标准)选项:

persistent_client_expiration持续时间

This option allows persistent clients (those with clean session set to false) to be removed if they do not reconnect within a certain

大体时间。这是一个非标准选项。就MQTT规范而言,持久客户端永远存在。

Badly designed clients may set clean session to false whilst using a randomly generated client id. This leads to persistent clients that

永远不会重新连接。此选项允许删除这些客户端。

The expiration period should be an integer followed by one of h d w m y for hour, day, week, month and year respectively. For example:

    persistent_client_expiration 2m

    persistent_client_expiration 14d

    persistent_client_expiration 1y

As this is a non-standard option, the default if not set is to never expire persistent clients.

这意味着如果客户端脱机的时间超过指定的时间,那么将转储该客户端的所有排队消息(并且不再排队)。

这可能是你能得到你想要的最接近的。

© www.soinside.com 2019 - 2024. All rights reserved.