5.7.2 中设置 sessionExpiryInterval 为 0xffffffff 多次重启后客户端收不到消息

只要客户端设置 sessionExpiryInterval 为 0xffffffff 后客户端收不到消息

使用 mqttx 配置一不设置 sessionExpiryInterval 可以正确发送
使用 mqttx 配置二设置 sessionExpiryInterval 为 4294967295 后,配置一发送任何消息,配置二都收不到

两个都监听了 # 使用任意语言 mqtt 客户端实现只有 sessionExpiryInterval 为 0 的情况下可以获取消息

Video: https://share.cleanshot.com/LhdW5yjj

收不到消息感觉跟 sessionExpiryInterval 没关系,一般是订阅的问题,或者是授权(ACL) 阻止了。

需要打开 debug 日志级别看看消息的交互流程:日志 | EMQX文档

看视频中使用一样的账号,一样的代码除了 sessionExpiryInterval 不同,订阅也是同一个,一个可以收到,一个不行,这也会是订阅 / acl 问题吗?

先用 Trace 功能把这几个 clientid 的消息交换流程抓一下

另外还请分享下 authn/authz (认证/鉴权) 的配置

  • 都有哪些后端
  • 这两个测试用的客户端是否会受到 ACL 限制
  • 如果有,它们可能会收到怎样的 ACL 限制

c01.zip (2.6 KB)
c02.zip (3.5 KB)
c03.zip (3.3 KB)

c01: 是收不到消息的 sessionExpiryInterval 为 0xffffffff
c02: 是收到消息的 sessionExpiryInterval 为 0
c03: 是发送消息的收不到消息,可以收到 $SYS 开头的 sessionExpiryInterval 为 1

c01 与 c02 的连接配置一致除了 sessionExpiryInterval 和 clientId 以外

    "clean": true,
    "reconnectPeriod": 1000,
    "connectTimeout": 30000,
    "resubscribe": true,
    "keepalive": 3,
    "protocolVersion": 5,
    "rejectUnauthorized": true,
    "manualConnect": true,

c03 是 mqttx 客户端



c01 和 c02 的代码

const mqtt = require('mqtt');

const connection = {
    "host": "192.168.0.254",
    "port": 1883,
    "username": "xxxxx",
    "password": "xxxxx",
}

const client = mqtt.connect({
    ...connection,
    "clean": true,
    "reconnectPeriod": 1000,
    "connectTimeout": 30000,
    "resubscribe": true,
    "keepalive": 3,
    "protocolVersion": 5,
    "rejectUnauthorized": true,
    "properties": {
        "sessionExpiryInterval": 0xffffffff, // 这里有差异
    },
    "manualConnect": true,
    "clientId": "MQTT:START" // 这里有差异
});

client.on('disconnect', (packet) => {
    console.log('disconnect', packet)
})

client.on('connect', () => {
    console.log('connected');
    client.subscribe({
        'put/+/+':{
            qos:2
        }
    });
});

client.on('message', (topic, message) => {
    console.log(topic, message.toString());
});

client.on('error', (err) => {
    console.log(err);
});

client.connect();

acl 配置

hi
检查并对比了几个 trace log 中的信息
c01.zip 中的日志显示它确实没有订阅到
msg: subscribe 为最关键的一条日志,有这条日志才能表明客户端的订阅请求被正确处理

还请补充一些关键信息来精确定位问题:

  • 节点和集群规格?部署方式?(docker/k8s/虚拟机)
  • EMQX 的配置,有没有对某些 MQTT 功能进行配置

SessionExpiryInterval 设置为 0xFFFFFFFF 并不会影响客户端的订阅行为:


通过 1panel 单机部署 docker 方式

etc.zip (62.4 KB) 整个配置

还需要提供什么信息吗?