提问者:小点点

Vert.x HTTP 客户端创建的连接数比 MaxPoolSize 多


我的应用程序中有 8 个顶点。每个顶点都位于单独的线程上。每个 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 是针对整个应用程序还是每个顶点的全局大小。那么对于 X.X.X.X:Y 我可以从我的应用程序创建 10 个连接或 80 个连接吗?

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


共1个答案

匿名用户

为了理解它是如何工作的,让我们看看HttpClientImpl的实际代码。
你会对这部分最感兴趣:

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

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

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

脚注:只有当你不接触http2MaxPoolSize时,这才是真的。如果你这样做,数学有点不同。