环境
重现此问题的步骤
- 如果开两个消费节点,500个设备的消息消费的话不会被踢,四个节点就会被踢,消费端过少不行过多也不行
- 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来说,应该是很轻松的。你可以简化你的消费端,让他收到消息就只打印一下,不要处理。先看看会不会有问题。
消费端过多也不行: 这个需要更详细的日志看是否有其它异常,目前信息太少,无法定位。
麻烦提供一下 EMQX 当时的日志,客户端根据你使用的库和自己定的代码有关系。我们无法定位
麻烦提供一下在emqx日志文件的日志,在log/emqx.log.1 这样的上当,这里有全部异常的日志,日志追踪只有部分的,现在看你这个日志追踪的日志里面也没有异常信息。
emqx.log.9.zip (387.3 KB)
消费节点一直被踢 ,但是提示是队列已满,丢弃了消息
这日志里面每一条都在提示你消费端太慢了。好多消息积累。。。
我不清楚你是怎么写消费端的。如果真的是生产者只有500消息/秒。那消费的你是不是有sleep在。。导致了很慢。
为了排查问题,你可以简化一下消费端,收到消息只计个数。打印一下。看看是什么情况。
我用node-red测试也是一样的,根本不需要写代码 ,broker还是踢
node-red 可以拖拉直接生成消费节点,我搞了两个,其中一个也是频繁被踢出
类似这样,两个节点不同clientid,还是被踢掉了,消息流出抖动