我想对我的Restful API服务器进行基准测试,因此我向其发送了大量请求以测量吞吐量和延迟。我使用Vert.x WebClient
来创建客户端。
首先,我从BenchmarkVerticle
创建AbstractVerticle
,并在WebClient
方法中创建start
。
public class BenchmarkVerticle extends AbstractVerticle {
@Override
public void start(Future<Void> future) {
WebClient client = WebClient.create(vertx);
while (true) {
// warm up in 10s and benchmark in 20s by sending requests
client.post(Server.port, "localhost", "/api")
.send(ar -> {
// do something after receiving response
});
}
}
}
然后我在BenchmarkVerticle
main
public static void main(String[] args) {
VertxOptions options = new VertxOptions();
options.setBlockedThreadCheckInterval(1000*60*60); // make BlockedThreadChecker not show
options.setWorkerPoolSize(40);
Vertx vertx = Vertx.vertx(options);
DeploymentOptions doptions = new DeploymentOptions()
.setWorker(true);
vertx.deployVerticle(new BenchmarkVerticle(), doptions);
}
我发现该请求仅在start
方法完成时发送。我认为每个请求都放在队列中,以便在方法start
完成后执行。它会影响我的基准测试结果。我尝试在setMultiThreaded(true)
对象中DeploymentOptions
使用多线程来同时发送它,但它说:
java.lang.IllegalStateException: Cannot use HttpClient in a multi-threaded worker verticle
那么如何在WebClient中立即发送请求? 注意:英语不是我的母语。如果你觉得难以理解,我会更详细。
答案 0 :(得分:0)
我不确定我理解设置。 BenchmarkVerticle
似乎毫无用处,除非它有更多你未在帖子中透露过的逻辑。
BenchmarkVerticle
负责处理请求
WebClient
引用future.complete()
start()
...然后
在具有main()
方法
WebClient
deployVerticle
的重载版本部署测试所需的任何Verticle:deployVerticle(String name,DeploymentOptions选项, 处理程序&GT; completionHandler)
最终部署Verticle时调用完成处理程序。在此处理程序中添加您的请求+响应处理。