Нерест много потоков никогда не бывает хорошей идеей (и когда вы создаете слишком много, у вас может закончиться нехватка памяти).Джерси-клиент, не блокирующий
Обычно для Джерси необходимо создать один поток для запроса. И, похоже, это так: пользуюсь ли я (где Джерси создает темы для меня - я исследовал это в отладчике), или нет (где я, очевидно, должен сам создавать темы).
Так вот одна конкретная ситуация, в которой это не достаточно хорошо:
Я HTTP размещения на удаленных серверах, со скоростью до 500 запросов/сек. Но поскольку ответ может занять некоторое время (я рассчитываю до 30 секунд), общее количество потоков может достигать нескольких тысяч (в этот момент процесс JVM обычно сбой). Более того, просто безумие создавать столько потоков. На самом деле это должен быть кусок торта для доступных ресурсов процессора/сети/ОС для борьбы с этой нагрузкой.
Итак, что бы я хотел сделать, это просто отключить запросы и получать информацию от ОС, когда поступит HTTP-ответ.
- Как сказано выше, просто используя
target.request(...).async()....
не делает трюк (потому что тогда Джерси просто порождает собственные потоки). - Кроме того, ограничение количества потоков через
new ClientConfig().property(ClientProperties.ASYNC_THREADPOOL_SIZE, 10)
не является полезным вообще, поскольку это означает, что не более 10 запросов будут отправляться за раз, что явно не то, что я хочу (он просто нагромождал очередь).
Я экспериментировал с new ClientConfig().connectorProvider(new GrizzlyConnectorProvider())
, чтобы получить поддержку NIO, но не видел никаких различий в поведении.
Итак, есть ли способ погасить запрос без необходимости создавать один дополнительный поток для каждого запроса?
Я только что нашел, что существует [jersey-non-blocking-client] (http://search.maven.org/#artifactdetails%7Ccom.sun.jersey.contribs%7Cjersey-non-blocking-client%7C1 .18.1% 7Cjar) и соответствующее [сообщение в блоге] (https://blogs.oracle.com/PavelBucek/entry/jersey_non_blocking_client), где автор решает проблему (хотя он серьезно недооценивает влияние неблокирующих и блокирующих). Однако, к сожалению, проект предназначен для старой версии Джерси, которую я не могу использовать. Может быть, новые версии Джерси уже поставляются с неблокирующей поддержкой? И если да, как его активировать? –
Количество потоков, которые вы можете запустить, во-первых, является вопросом кучи пространства. В 2048 году нет ничего волшебного. – EJP
@ EJP: Спасибо, я исправил вопрос. –