代码之家  ›  专栏  ›  技术社区  ›  enator

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

  •  2
  • enator  · 技术社区  · 6 年前

    在MQTT规范中,存在控制服务器和客户端上的保留和状态的连接标志。

    清洁会话 specification 建议:

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

    此位指定会话状态的处理。客户和 服务器可以存储会话状态,以便向 通过一系列网络连接继续。此位用于 控制会话状态的生存期。

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

    断开CleanSession设置为0的会话后, 服务器必须存储与任何 客户端在断开连接时作为一部分拥有的订阅 会话状态的

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

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

    2 回复  |  直到 6 年前
        1
  •  4
  •   enator    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]。

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

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

        2
  •  3
  •   hardillb    5 年前

    简而言之,您不能(在v3.0规范范围内)。

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

    您没有提到您正在使用哪个代理,但mosquitto有以下(非标准)选项:

    persistent\u client\u过期 期间

    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.
    

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

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