物联网学习(二)kafka-mqtt-connector性能测试

延迟测试

测试 从mqtt 客户端到 kafka写入消息时间以及kafka发送消息到设备端接收到消息的时间延迟.

测试场景 mqtt -> mq

准备

发送客户端使用简单的eclipse mqtt 客户端,简单地使用循环发送消息,每次发送前记录当前时间戳:

1
2
3
4
5
6
7
8
...
for (int i = 0; i < Integer.valueOf(args[2]); i++) {
MqttMessage message = new MqttMessage(String.valueOf(i).getBytes(StandardCharsets.UTF_8));
message.setQos(qos);
System.out.println(" time:" + Instant.now().toEpochMilli() + ",Message publish:" + i);
sampleClient.publish(args[1], message);
}
...

这里使用main方法传入的第二个参数作为发送主题名,第一个参数作为mqtt服务器的地址,第三个参数作为循环次数,然后打包成 mqtt-producer.jar在服务器备用。

同时这里设置我们网桥程序内部缓存双向队列的空闲等待时间为4ms, 可以设置更低,这里设置4ms 避免占用太多CPU资源。

然后创建响应的kafka的主题,并设置主题的timestamp为kafka写入日志的时间: message.timestamp.type=LogAppendTime kafka 接收端就使用kafka官方提供的consumer 控制台打印时间戳到日志文件。

测试脚本

发送端直接使用准备的mqtt-producer.jar,执行命令将时间记录到日志文件:

1
java -jar mqtt-producer.jar tcp://192.168.0.2:1833 /tacos/pub/lf 1000000 >>pub_lf.txt &

在消息发送完成后使用kafka-console-consumer 打印时间戳到日志文件:

1
sh bin/kafka-console-consumer.sh  --topic _tacos_pub_lf  --bootstrap-server 192.168.0.5:9092,192.168.0.9:9092,192.168.0.13:9092   --property print.timestamp=true --from-beginning >>_tacos_pub_lf.txt &

测试结果

整理比对发送端和接收端的日志文件,比较是否存在数据差异,根据时间戳计算延迟(详情见附件result.xlsx表格mqtt to kafka):

平均 最大值 50%分布 90%分布 99% 分布
2.44ms 70ms 2ms 4ms 5ms

总结:mqtt发送消息到kafka 写入日志文件,平均耗时可以控制在2ms, 基本符合我们设置的内部缓存队列的超时实际4ms .

测试场景 mq -> mqtt

准备

发送客户端使用kafka提供的生产者性能测试工具进行压力测试,创建对应的主题,这里不需要单独设置主题的时间戳类型,使用默认的即生产者创建消息的实际作为时间戳。

接收端使用eclipse的客户端简单的打印接收到的信息和时间戳:

1
sampleClient.subscribe(args[1], 1, (topic1, message) -> System.out.println(" time:" + Instant.now().toEpochMilli() + ",Message arrived:" + message));

测试脚本

首先启动我们的mqtt消费端,将其控制台日志打印到日志文件:

1
java -jar mqtt-consumer.jar tcp://192.168.0.2:1833 /tacos/sub/l >>log.txt &

然后使用kafka压测工具发送消息:

1
sh bin/kafka-producer-perf-test.sh --topic _tacos_sub_le  --num-records 200000  --throughput 1000  --producer.config config/producer.properties --payload-file data.txt

发送完毕之后使用kafka消费者控制台记录时间戳到日志文件:

1
sh bin/kafka-console-consumer.sh  --topic _tacos_pub_le  --bootstrap-server 192.168.0.5:9092,192.168.0.9:9092,192.168.0.13:9092   --property print.timestamp=true --from-beginning >>_tacos_pub_le.txt &

测试结果

整理比对发送端和接收端的日志文件,比较是否存在数据差异,根据时间戳计算延迟(详情见附件result.xlsx表格kafka to mqtt):

平均 最大值 50%分布 90%分布 99% 分布
1.25ms 139ms 1ms 2ms 2ms

总结:kafka发送消息到mqtt设备端接收消息,平均耗时1.25ms, 基本符合我们的预期.