问题描述
我是 vertx 和 RxJava 的新手。我正在尝试实现一个简单的测试程序。但是,我无法理解该程序的动态。为什么有些请求的响应时间超过 10 秒?
下面是我的示例测试应用程序
public class Test {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
WebClient webClient = WebClient.create(vertx);
Observable < Object > google = hitURL("www.google.com",webClient);
Observable < Object > yahoo = hitURL("www.yahoo.com",webClient);
for (int i = 0; i < 100; i++) {
google.repeat(100).subscribe(tiMetaken -> {
if ((Long) tiMetaken > 10000) {
System.out.println(tiMetaken);
}
},error -> {
System.out.println(error.getMessage());
});
yahoo.repeat(100).subscribe(tiMetaken -> {
if ((Long) tiMetaken > 10000) {
System.out.println(tiMetaken);
}
},error -> {
System.out.println(error.getMessage());
});
}
}
public static Observable < Object > hitURL(String url,WebClient webClient) {
return Observable.create(emitter -> {
Long l1 = System.currentTimeMillis();
webClient.get(80,url,"").send(ar -> {
if (ar.succeeded()) {
Long elapsedtime = (System.currentTimeMillis() - l1);
emitter.onNext(elapsedtime);
} else {
emitter.onError(ar.cause());
}
emitter.onComplete();
});
});
}
}
我想知道的是,是什么让我的响应时间变慢了?
解决方法
这里的问题似乎在于您使用 /
的方式和/或您测量“响应”时间的方式(取决于您在这里尝试实现的目标)。
Vert.x 的 WebClient
与大多数 http 客户端一样,在后台使用有限大小的连接池来发送请求。换句话说,调用 WebClient
不一定立即启动 http 请求 - 相反,它可能会在某种队列中等待可用连接。您的测量包括这个潜在的等待时间。
您使用的默认池大小似乎是 5(至少在最新版本的 Vert.x 中 - 它定义为 here),并且几乎立即启动了 200 个 http 请求。大多数情况下,您的请求都在等待可用的连接,这并不奇怪。
如果您想测试我是否正确,您可以尝试增加池大小:
WebClient webClient = WebClient.create(vertx,new WebClientOptions().setMaxPoolSize(...));