我想对我的 Restful API 服务器进行基准测试,因此我向它发送了大量请求来测量吞吐量和延迟。我使用 Vert.x WebClient
创建客户端。
首先,我创建从 AbstractVerticle
扩展的 BenchmarkVerticle
并在 start
方法中创建一个 WebClient
。
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
});
}
}
}
然后我在 main
中部署 BenchmarkVerticle
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
完成后执行。它影响我的基准测试结果。我尝试通过 DeploymentOptions
对象中的 setMultiThreaded(true)
使用多线程来使其同时发送,但它说:
java.lang.IllegalStateException: Cannot use HttpClient in a multi-threaded worker verticle
那么如何在WebClient中立即发送请求呢?注意:英语不是我的母语。如果您觉得难以理解,我会更详细地解释。
我不确定我是否理解这个设置。 BenchmarkVerticle
似乎没什么用,除非它有更多你在帖子中没有透露的逻辑。
- 如果
BenchmarkVerticle
负责处理请求
- 从此类中删除
WebClient
引用
- 请务必在
start() 主体末尾调用 future.complete()
- ...否则只需将其删除
然后...
在具有 main()
方法的类中
- 在此处创建
WebClient
- 然后使用允许您提供completionHandler的重载版本的
deployVerticle
部署测试所需的任何Verticle:
deployVerticle(String name, DeploymentOptions options, Handler> completionHandler)
当您的 Verticle 最终部署时,将调用完成处理程序。在此处理程序中添加您的请求+响应处理。
我是一名优秀的程序员,十分优秀!