为什么 Exhook 的处理速度只有 Broker 消息流入速度的 50%

EMQX 版本

sysdescr  : EMQX
version   : 5.0.0
datetime  : 2024-03-28T08:42:33.755258417+00:00
uptime    : 1 days, 4 hours, 6 minutes, 25 seconds

EMQX 安装部署方式

docker

EMQX 集群情况

单节点

服务器(运行 EMQX 的机器)硬件配置

16核 32GB

服务器操作系统和平台

Centos7, amd64

在 EMQX 中启用的功能

Exhook

测试场景

200 个设备连接以 200 QPS 进行测试

具体问题

运行官方提供的 demo,通过 Jmeter 建立 200 个连接压测, EMQX Dashboard 显示消息流入 200 条/秒,但是观察 exhook 的监控,显示处理速度平均下来只有每秒 100 条左右。
是有什么配置没有打开吗?

EMQX Dashboard 中的消息流入速度:

Exhook 的当前速度:

尝试过的操作

因为是用做 kafka 的转发,当用 200 QPS 流入 emqx 时,发现向 kafka 流入速度正好是 100 条/秒,就对压测的消息流入和连接数量分别进行放大(300 QPS)和缩小(100 QPS),结果 exhook 消息处理速度同样会保持此比例(150 QPS) 和 (50 QPS)。

为了避免干扰,只用单纯的官方提供的 demo 进行测试,发现是同样的结果。

服务器负载

部署 exhook 的服务器很低。

下面是 ping emqx 服务器的延迟:

[root@localhost ~]# ping 172.18.100.23
PING 172.18.100.23 (172.18.100.23) 56(84) bytes of data.
64 bytes from 172.18.100.23: icmp_seq=1 ttl=64 time=0.321 ms
64 bytes from 172.18.100.23: icmp_seq=2 ttl=64 time=0.338 ms
64 bytes from 172.18.100.23: icmp_seq=3 ttl=64 time=0.332 ms
^C
--- 172.18.100.23 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.321/0.330/0.338/0.016 ms

同样尝试过和 emqx 部署在一起,排除延迟干扰,发现同样没有区别。

DEBUG 日志

没有发生错误和告警,日志都是 debug 日志,截取了最近的 50000 行:
exhook-log.zip (571.0 KB)。

看起来像是速率不匹配。但是这样的话 EMQX 应该有消息堆积和错误日志才对。

从 Kafka 侧看,最终所有的消息都被正确的存储到那边了么?

另外,请提供下 JMeter 的发布消息的主题、和 ExHook 在 EMQX 这边配置和注册钩子的详情

你好,我已经找到了原因,目前看来貌似是 1 个 EMQX Dashboard 的 Exhook 速率统计的 BUG。下面是我的测试方法:

我通过 Jemeter 建立了 400 个连接。这是 EMQX Dashboard 的消息流入速度和 Exhook 处理速度的显示:

消息流入速率:

Exhook 速率:

然后使用 arthas 尝试 monitor 命令以 1s 为周期监控了 onMessagePublish 回调方法和 KafkaTempalte#send 方法执行次数:

  1. 监控 onMessagePublish 回调方法
monitor -c 1 zhuowei.iot.exhook.ExServer$HookProviderImpl onMessagePublish 

onMessagePublish 的调用次数是正确的,以 400 次每秒的速率进行调用 :

  1. 监控 kafka 侧的消费者:
monitor -c 1 zhuowei.iot.kafka.service.countDeviceMessageConsumerListener$MessageCountSessionCallback

消费速度同样以 400条/每秒的速度进行 :

回答你的问题:

  1. 消息没有被丢失。

  2. 注册的钩子。因为只用到转发和上下线统计。我把其它钩子都取消掉了。

  3. 因为用于测试,topic 是随机的