数据发送频率过快时连接会被踢掉收不到回复心跳

环境信息

  • EMQ X 版本:4.2
  • 操作系统及版本:centos7.9
  • 其他

问题描述

当建立8到9个连接时候,每个连接启动40个并发线程每秒定时发送数据,这个时候连接会被慢慢踢掉(Dashboard 观察),据观察应该是没有收到emqx心跳回复。。。单个连接并发量有限制吗?

配置文件及日志

具体是需要看客户端实现,erlang客户端测试,QOS1大概在3000/s QOS0大概在8000/s, QOS2大概在1000/s

是不是和消费端有关?比如我单个tcp发送信息过快,消费端消费不过来,会不会踢掉生产端的tcp连接?我能关掉消费端(默认消息丢弃),来排查这个问题吗?

可以,EMQX 有内存保护机制,单个客户端消息堆积比较多,就被服务器强制退出, 详细请查看https://docs.emqx.cn/broker/v4.3/configuration/configuration.html#zone-external-force-shutdown-policy

还请问clean_session = true 和false的区别,是不是为true的话,会话断开就不建立飞行窗口和消息存储队列,broker接收到的消息直接丢弃?否则就申请这些队列的内存区存储再分发给消费端

clean_session=false情况下,tcp连接断开后,服务器会保持session一段时间,可以接收消息等,
等到客户端登录,还是可以接收到断开后消息。
clean_session=true情况下,tcp连接断开后,session也销毁了

session销毁或者没人订阅的情况下,生产者上传的消息是怎样处理的?直接丢弃?还会存飞行队列和存储队列吗(这两个队列还会存在吗)

直接丢弃

请问QOS1大概在3000/s QOS0大概在8000/s, QOS2大概在1000/s是单topic吗

如果某个客户端消息堆积比较多 服务器是会强制退出吗 是踢除客户端吗 我现在有一种情况就是 某个客户端发送指令很频繁 然后会导致 我收不到心跳 但是服务器上客户端是订阅了的 必须要手动踢除 然后我才能收到心跳包

是因为心跳包堵在消息队列里了

有解决方案吗

你的设备消费能力不足导致的,要提高一下设备的消费能力,没有特别好的办法

设备客户端 - emq - java服务端 客户端订阅上emqx 我在java服务端可以收到emqx发送的设备心跳包 现在我在java服务端发送指令过多 会导致我收不到emqx转发的心跳包 但是设备客户端是订阅了的 除非我上emqx手动踢除这台设备的订阅或者是设备断网 然后等这个设备重新订阅 我才能收到心跳

设备客户端 - emq - java服务端 客户端订阅上emqx 我在java服务端可以收到emqx发送的设备心跳包 现在我在java服务端发送指令过多 会导致我收不到emqx转发的心跳包 但是设备客户端是订阅了的 除非我上emqx手动踢除这台设备的订阅或者是设备断网 然后等这个设备重新订阅 我才能收到心跳

EMQX - Java服务端之间是怎么关联的呢?是MQTT链接的,还是HTTP API?

MQTT

两个建议,
1 看下设备消费指令的能力,是不是有问题
2 抓包看下设备的心跳包发送的周期

设备的心跳到了emq 然后emq没转发给服务端 现在是这个原因 踢除了重新订阅上就可以发送了 说明设备没问题

看看java版本和emqx版本号是否对应,,,,还有感觉你的架构有问题,客户端心跳干嘛要经过emq后服务端接收,,完全可以用restapi判断是否在线。。。