2016-02-16 3 views
4

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

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

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

  • асинхронного-клиентом -client v1.9.33
  • Нетти v3.10.5.Final

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

EDIT:

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

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

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

+0

Подсказка: HTTP-запросы не обязательно повторно используют одно и то же соединение;) –

+0

@EranHarel не уверен, что понял подсказку, но теперь я думаю, что максимальное количество подключений означает количество открытых подключений, которое напрямую не влияет на количество потоков (так как один селектор слушает несколько сокетов), я нахожусь на правильном пути? – Gideon

+0

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

ответ

4

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

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