500个设备每秒发送1个json,消费端频繁的被踢

环境

  • EMQX 版本:
  • 操作系统版本:

重现此问题的步骤

  1. 如果开两个消费节点,500个设备的消息消费的话不会被踢,四个节点就会被踢,消费端过少不行过多也不行
  2. msg: emqx_connection_terminated, reason: {shutdown,message_queue_too_long} 这是消费节点不够的情况下被踢的原因,但是我消费加到四个,还是会被踢,两个消费节点非常稳定
    3.我使用了paho mqtt,new了几个client进行测试,顺边问一下 多个订阅比如 data/1 data/2 开共享订阅能不能吧所有订阅都分到一个group里面,分别压到几个消费节点上

预期行为

实际行为

msg: emqx_connection_terminated, reason: {shutdown,message_queue_too_long}

message_queue_too_long 这个可以明确的说明消费能力跟不上。
你可以通过下面的配置来调高queue的长度,但是这也只能延缓积累的,积累超多,消耗的内存越多,直到你的内存用完。

force_shutdown {
   max_message_queue_len = 10000   # 他默认是1000,或者不限制就设置为infinity
}

500 个设备每秒发一个json,那么总的流入才500 消息/秒。对EMQX来说,应该是很轻松的。你可以简化你的消费端,让他收到消息就只打印一下,不要处理。先看看会不会有问题。

消费端过多也不行: 这个需要更详细的日志看是否有其它异常,目前信息太少,无法定位。

问题3关于共享订阅的,不太理解。可以展开说说么。


两个节点消费,打印的,还是被踢

麻烦提供一下 EMQX 当时的日志,客户端根据你使用的库和自己定的代码有关系。我们无法定位 :pray:

mqtt-p0KHvZeKOd.zip (85.7 KB)
这是日志追踪的

麻烦提供一下在emqx日志文件的日志,在log/emqx.log.1 这样的上当,这里有全部异常的日志,日志追踪只有部分的,现在看你这个日志追踪的日志里面也没有异常信息。

emqx.log.9.zip (387.3 KB)
消费节点一直被踢 ,但是提示是队列已满,丢弃了消息

这日志里面每一条都在提示你消费端太慢了。好多消息积累。。。
我不清楚你是怎么写消费端的。如果真的是生产者只有500消息/秒。那消费的你是不是有sleep在。。导致了很慢。
为了排查问题,你可以简化一下消费端,收到消息只计个数。打印一下。看看是什么情况。

我用node-red测试也是一样的,根本不需要写代码 ,broker还是踢

node-red 可以拖拉直接生成消费节点,我搞了两个,其中一个也是频繁被踢出


类似这样,两个节点不同clientid,还是被踢掉了,消息流出抖动


mqttx三个连接也是被踢 ,流出速率有问题