Знает ли AsyncHttpClient, сколько потоков нужно выделить для всех HTTP-запросов?

Я оцениваю AsyncHttpClient для больших нагрузок (~ 1 М HTTP-запросов). Для каждого запроса я хотел бы вызвать обратный вызов с помощью AsyncCompletionHandler, который просто вставит результат в очередь блокировки.

Мой вопрос: если я отправляю асинхронные запросы в замкнутом цикле, сколько потоков будет использовать AsyncHttpClient? (Я знаю, что вы можете установить максимальное значение, но, видимо, вы рискуете потерять запросы, я видел это здесь)

В настоящее время я использую реализацию Netty с этими версиями:

  • асинхронный http-клиент v1.9.33
  • нетти v3.10.5.Final

Я не возражаю против использования других версий, если в более поздних версиях есть какая-либо оптимизация.

РЕДАКТИРОВАТЬ:

Я читал, что Netty использует шаблон реактора для реагирования на ответы HTTP, что означает, что он выделяет очень небольшое количество потоков для работы в качестве селекторов. Это также означает, что количество выделенных потоков не увеличивается при большом объеме запросов. Однако это противоречит необходимости устанавливать максимальное количество подключений.

Кто-нибудь может объяснить, что мне не хватает?

заранее спасибо


person Gideon    schedule 16.02.2016    source источник
comment
Подсказка: HTTP-запросы не обязательно повторно используют одно и то же соединение;)   -  person Eran Harel    schedule 19.02.2016
comment
@EranHarel не уверен, что понял намек, но теперь я думаю, что максимальное количество соединений просто означает количество открытых соединений, которое напрямую не влияет на количество потоков (поскольку один селектор прослушивает несколько сокетов), я на правильном пути?   -  person Gideon    schedule 19.02.2016
comment
Когда вы не используете поддержку активности HTTP, соединение не используется повторно, поэтому, когда вы отправляете много запросов на определенный хост или домен, вы создаете много соединений (по одному на запрос). В некоторых случаях можно перегрузить сайт/сервис, или получить блокировку при флуд. Вот почему клиенты имеют эту настройку. Несмотря на это, netty не будет увеличивать количество потоков независимо от того, сколько одновременных запросов/соединений вы создаете.   -  person Eran Harel    schedule 19.02.2016
comment
Это определенно лучше организует вещи в моей голове. Напишите это как ответ, и я приму его, спасибо за помощь   -  person Gideon    schedule 20.02.2016


Ответы (2)


Клиенту AsyncHttpClient (и другим неблокирующим клиентам ввода-вывода) не нужно выделять поток для каждого запроса, и клиенту не нужно изменять размер своего пула потоков, даже если вы бомбардируете его запросами. Вы инициируете много подключений, если не используете HTTP keep-alive или не вызываете несколько хостов, но все это может быть обработано одним многопоточным клиентом (может быть более одного потока ввода-вывода, в зависимости от реализации).

Однако всегда рекомендуется ограничивать максимальное количество запросов на хост и максимальное количество запросов на домен, чтобы избежать перегрузки службы на конкретном хосте или сайте и избежать блокировки. Вот почему HTTP-клиенты добавляют параметр maxConnectionsPerXxx.

person Eran Harel    schedule 22.02.2016

AHC имеет два типа резьбы:

  1. Для операций ввода/вывода. На вашем экране это потоки AsyncHttpClient-x-x. AHC создает 2*core_number из них.
  2. Для тайм-аутов. На вашем экране это поток AsyncHttpClient-timer-1-1. Должен быть только один.

И как вы упомянули:

maxConnections просто означает количество открытых подключений, которые напрямую не влияют на количество потоков

Источник: выпуск на GitHub: https://github.com/AsyncHttpClient/async-http-client/issues/1658

person Mike Mike    schedule 08.08.2019