请问 MQTT 会话 “最大消息队列长度” 能否针对某一个连接客户端设置 , 而不是全局设置呢?

请问 MQTT 会话 “最大消息队列长度” 能否针对某一个连接客户端设置 , 而不是全局设置呢?

只针对一个客户端这种控制精度太高了,目前还做不到。

不过 EMQX 允许你为不同的监听器配置不同的 zone,每个 zone 下可以有一些独立的配置。具体的可以参考 配置说明 - Zone 文档。

感谢回复。
我描述一下我们的使用场景,烦请看看有没有更好的解决办法。

会有上万个设备同时连接到 emqx mqtt broker,消费端服务是通过 Clean Session = false 来订阅这些设备消息, 以便服务重启或升级期间不会丢失消息。

消息有时候在几秒钟内会达到几十万条——在这种情况下,就希望消息可以被缓存起来,达到削峰效果。
另外, 消费端的服务会因为比如版本发布、出现bug短时间内重启之内的,也会造成消息的累积。

其中, mqtt 会话的消息队列我们又尝试配置过比较大的值(比如100000),但是这个配置是全局的, 不确定是否会有不好的影响,看是否有更好的办法解决以上场景。

这种的话其实是最好能借助 EMQX 企业版桥接消息到 Kafka 的能力来做。

为所有客户端配置较大的最大消息队列长度,可能会导致实际运行时 EMQX 占用内存过多出现 OOM 被 OS 杀死。

好的, 后续我们也会了解下企业版本。

其他客户端消息很少,不会用到这么长的队列, 所以是不是对内存就没有影响呢?因为我理解这个队列长度值是一个限制阈值 而不是预留内存空间。

很简单。你把那个大的客户端的消息,分拆成小的发送。比如1分3,然后带上时间戳。比如:
20230207-11:20:30-Part1,
20230207-11:20:30-Part2,
20230207-11:20:30-Part3
订阅后,再拼接。part1,part2,part3必须同时出现且前缀时间一致。否则就丢弃。
当然你客户端不能自定义、编程,那另当别论。

当然, 如果“消息有时候在几秒钟内会达到几十万条”,那么要削峰,只能在客户端编程,压缩成文件,然后payload传输2进制流。这个,同样要这个客户端支持编程。那种透传的单片机客户端往往不行。