2

我的应用程序中有 8 个垂直。每个 Verticle 都在一个单独的线程上。每个 Verticle 都有一个 WebClient ( Vert.x HTTP 客户端)我将 MaxPoolSize 设置为 10。 WebClientOptions webClientOptions = new WebClientOptions() .setMaxPoolSize(10) 但是当我检查时

/usr/sbin/ss -o state established -tn  | tail -n +2  | awk '{ print $4 }' | sort |uniq -c | sort -n

在生产主机上,我可以看到每个 IP:Port 有超过 10 个连接。

问题 1:MaxPoolSize 是针对整个应用程序还是针对每个 Verticle 全局的。那么对于 XXXX:Y,我可以从我的应用程序创建 10 个或 80 个连接吗?

问题 2:当我向其 DNS 中具有多个 IP 的主机发送请求时,连接池是按主机还是按 IP?例如 gogo.com 解析为 2 个 IP 地址。我可以创建 10 个到 gogo.com 20 的连接吗?

4

1 回答 1

2

要了解它是如何工作的,让我们看一下HttpClientImpl.
你会对这部分最感兴趣:

https://github.com/eclipse/vert.x/blob/master/src/main/java/io/vertx/core/http/impl/HttpClientImpl.java#L161

如您所见,每个WebClient/HttpClient都有自己的连接池。因此,maxPool 为 10 的 8 个客户端将产生 80 个连接。

至于你的第二个问题,据我所知,连接是每个主机,而不是 IP,并且可以从代码中看到。因此,您将始终能够建立多达 10 个连接: https://github.com/eclipse/vert.x/blob/39c22d657d2daf640cfbdd8c63e5110fc73474fb/src/main/java/io/vertx/core/http/impl/ConnectionManager。爪哇#L56

脚注:只有当您不触摸时,这一切都是正确的http2MaxPoolSize。如果你这样做,数学有点不同。

于 2018-04-07T10:15:47.187 回答