消息队列设置max_mqueue_len为0时数据丢失

环境信息

  • EMQX 版本:4.4.0
  • 操作系统及版本:CentOS 7.9
  • 其他

问题描述

emqx已设置zone.external.max_mqueue_len为0,数据publish和subscribe均使用qos:1。
当突发大量publish数据时消费能力不足导致数据堆积,此时emqx及系统内存占用不高。若停止数据publish后,emqx中堆积的数据持续推送时存在数据丢失,请教可能存在的原因。

这个配置是客户端在消费能力不足的时候,emqx先将消息缓存到设备进程中,配置值就是最大缓存的消息条目数,推荐使用默认值。

按照文档描述max_mqueue_len配置为0时会缓存全部数据,内存占用也不高的话为何会存在数据丢失呢?

看下消费端有消息下去吗?是不是消费端业务不完整导致的QoS1消息没完全结束

内存占用要看消息的大小的,消息堆积也需要时间,不会立即升很高的。

丢失数据是什么情况呢?消费端发现收到的少了吗?我还没明白你的使用场景,不是很清楚问题

我简单描述一下:消费端是java后台,使用paho-mqttv3 client V1.2.5连接emqx,通过setCallback设置回调消费数据,不清楚您说的qos1的消息结束是哪一步呢。
整体情况是:生产者100秒内发布了10W条消息至emqx并停止数据发送;消费端在10秒内持无法全部处理,因此在生产者停止发送后继续处理,此时当处理总数据量到达9W条时不再有新消息推送过来,相当于有1W条数据丢失。

可以先确定一下消息丢掉的位置,可以开一个规则引擎,FORM 的条件选择你的测试topic,并且在动作中使用空动作-调试,发送消息之后看下规则的计数器,是否是跟发送端一致。
如果是发现计数器一致,可以看下日志中有没有error信息,丢弃信息都是有日志打印的,看下阻塞在哪里。

PS:
推荐使用共享订阅来解决消费能力不够的情况,参考文档

好的 谢谢回答 我先去调试