我的应用程序中有8个Verticle。每个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有超过10个连接:端口。
问题1: MaxPoolSize是整个应用程序还是每个Verticle的全局。 所以对于X.X.X.X:我可以从我的应用程序创建10个连接或80个连接吗?
问题2: 当我向其DNS中有多个IP的主机发送请求时,连接池是按主机还是按IP? 例如,gogo.com解析为2个IP地址。我可以创建10个与gogo.com 20的连接吗?
答案 0 :(得分:1)
要了解它的工作原理,让我们看一下HttpClientImpl
的实际代码
你最感兴趣的是这部分:
如您所见,每个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.java#L56
脚注:只有在您不触及http2MaxPoolSize
时才会出现这种情况。如果你这样做,数学会有所不同。