问题背景
mqtt已经是主流的物联网消息中间件,在实际项目中需要压测目前emq集群的性能,虽然官网上已经提供了benchmark工具,但是本人是准备了半天erlang的环境最后没搞定打算自己写一个,同时可以加上业务上的代码,控制输入和输出
技术实现
如何在一个进程中模拟百万个设备连接到emq服务器,同时监控到设备收发消息是否正常。第一个想到的便是使用golang的协程,每个协程作为一个客户端,我找到了一个项目:mqtt-benchmark golang版大家可以参考一下。同时jmeter也有mqtt的测试插件:mqtt-jmeter,所以我在想如何通过java来实现,在jdk19的新特性中有一项是Virtual Threads,由于是刚刚发布,我想还是先基于jdk11来实现吧。
我们知道netty是可以处理高连接数的,其原理在于基于reatctor模型的io多路服用,我便发现了一个基于netty的异步编程框架vert.x,在看过vert.x的文档后,发现其已经实现了mqtt协议的server/client,于是先写了一个demo,跑了一万个连接:
public class SampleClient {
public static void main(String[] args){
Vertx vertx = Vertx.vertx();
for(int i=0;i<10000;i++) {
MqttClient client = MqttClient.create(vertx);
Future<MqttConnAckMessage> future = client.connect(1883, "127.0.0.1","client-"+i);
future.onSuccess(handler -> {
client.publishHandler(s -> {
System.out.println("There are new message in topic: " + s.topicName());
System.out.println("Content(as string) of the message: " + s.payload().toString());
System.out.println("QoS: " + s.qosLevel());
}).subscribeCompletionHandler(s -> {
System.out.println("subscribe success");
}).subscribe("rpi2/temp", 2);
});
}
}
}
运行后完全无压力,这里只给大家提供了一个思路,后续会将全部的测试程序发出来