HTTP-клиент Vert.x создает больше соединений, чем MaxPoolSize

У меня в заявке 8 вертикалей. Каждая вертикаль находится на отдельной нити. У каждой статьи есть WebClient (HTTP-клиент Vert.x). Я устанавливаю для 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

На производственном хосте я вижу, что существует более 10 соединений на IP: порт.

Вопрос 1: является ли MaxPoolSize глобальным для всего приложения или для каждой статьи. Итак, для XXXX:Y я могу создать 10 соединений или 80 из моего приложения?

Вопрос 2: Когда я отправляю запрос узлу с более чем одним IP-адресом в DNS, будет ли пул соединений для каждого узла или для каждого 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 клиентов с maxPool 10 приведут к 80 соединениям.

Что касается второго вопроса, то, как я знаю, соединение выполняется для каждого хоста, а не для IP, и это видно из кода. Таким образом, вы всегда сможете установить до 10 подключений: https://github.com/eclipse/vert.x/blob/39c22d657d2daf640cfbdd8c63e5110fc73474fb/src/main/java/io/vertx/core/http/impl/ConnectionManager.java#L56

Сноска: все это верно только в том случае, если вы не прикасаетесь http2MaxPoolSize, Если вы делаете, математика немного отличается.

Другие вопросы по тегам