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
,
Вас больше всего заинтересует эта часть:
Как видите, каждый 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
, Если вы делаете, математика немного отличается.