You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MQTT QoS 2客户端断连6天后重启未收到旧消息咨询

问题描述

我们使用运行在Ubuntu 22.04.1系统上的Eclipse MQTT Broker 2.0.11版本,服务器配置如下:

persistence true
persistence_location xxxxxxxxxx
per_listener_settings true
log_timestamp_format [%Y-%m-%d %H:%M:%S]
max_inflight_messages 1000
#
#       Port 1883 (NO TLS)
#
listener 1883
allow_anonymous true
allow_zero_length_clientid false
#
#       Port 8883 (TLS)
#
listener 8883
allow_anonymous false
allow_zero_length_clientid false
cafile xxxxxxx
certfile xxxxxxx
keyfile xxxxxxx
dhparamfile xxxxxxx
password_file xxxxxxx
acl_file xxxxxxx

某客户端与Broker断连约6天,重启后出现日志:

ClientState: xxxxxxxxxxx: Timed out as no activity, keepAlive=20,000,000,000 lastOutboundActivity=5,084,923,567,979 ....

客户端相关配置参数如下:

QoS=2
AutoReconnect=true
CleanSession=false
connectionTimeout=60
keepAliveInterval=20
maxInflight=1000

重启后客户端未收到任何旧消息,请问是否存在旧消息的保留期限?


解答
  1. Eclipse Mosquitto Broker的离线消息保留规则
    MQTT协议本身没有强制规定离线消息的保留期限,Mosquitto的行为由配置决定:

    • 默认(未配置persistent_client_expiration):只要开启了持久化(你已设置persistence true),且客户端CleanSession=false,Broker会永久保留该客户端的QoS 1/2离线消息,直到客户端上线接收,或者手动删除客户端会话。
    • 自定义过期:若配置persistent_client_expiration(如persistent_client_expiration 7d),客户端断连超过设定时间后,Broker会自动清除其会话及未发送的离线消息。
  2. 你的场景中消息丢失的核心原因
    你未收到旧消息并非默认保留期限导致,结合日志和配置分析,可能的原因包括:

    • Broker的持久化存储文件损坏,导致会话和离线消息丢失;
    • 客户端重启时使用了与之前不一致的Client ID,Broker无法识别并恢复原有会话;
    • 存在未展示的persistent_client_expiration配置,其设定的过期时间短于6天,导致会话被自动清除。

    日志中的keepAlive=20,000,000,000是20秒(纳秒单位),客户端断连后,Broker在30秒(1.5倍keepalive间隔)未收到心跳就会标记其离线,但默认情况下会话仍会保留,不会自动删除。

内容的提问来源于stack exchange,提问作者Pentolone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:53:38