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
重启后客户端未收到任何旧消息,请问是否存在旧消息的保留期限?
解答
Eclipse Mosquitto Broker的离线消息保留规则
MQTT协议本身没有强制规定离线消息的保留期限,Mosquitto的行为由配置决定:- 默认(未配置
persistent_client_expiration):只要开启了持久化(你已设置persistence true),且客户端CleanSession=false,Broker会永久保留该客户端的QoS 1/2离线消息,直到客户端上线接收,或者手动删除客户端会话。 - 自定义过期:若配置
persistent_client_expiration(如persistent_client_expiration 7d),客户端断连超过设定时间后,Broker会自动清除其会话及未发送的离线消息。
- 默认(未配置
你的场景中消息丢失的核心原因
你未收到旧消息并非默认保留期限导致,结合日志和配置分析,可能的原因包括:- Broker的持久化存储文件损坏,导致会话和离线消息丢失;
- 客户端重启时使用了与之前不一致的Client ID,Broker无法识别并恢复原有会话;
- 存在未展示的
persistent_client_expiration配置,其设定的过期时间短于6天,导致会话被自动清除。
日志中的
keepAlive=20,000,000,000是20秒(纳秒单位),客户端断连后,Broker在30秒(1.5倍keepalive间隔)未收到心跳就会标记其离线,但默认情况下会话仍会保留,不会自动删除。
内容的提问来源于stack exchange,提问作者Pentolone
相关产品推荐
相关产品推荐

