Асинхронная обработка запросов в веб-приложении Java - PullRequest
0 голосов
/ 16 февраля 2019

Мне нужно написать веб-приложение, которое получает много HTTP-запросов и занимает много времени (от 30 секунд до 2 минут) для обработки каждого запроса (в свою очередь, для выполнения других сетевых запросов) перед возвратом ответа.

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

Если каждый запрос занимает много времениобработать, это собирается заблокировать обработку netty?Или я могу получить запрос и затем асинхронно обработать его, прежде чем вернуть результат в соединение запроса?

1 Ответ

0 голосов
/ 16 февраля 2019

Пока вы не блокируете цикл событий, вы сможете обслуживать значительное количество одновременных запросов (в зависимости от доступной памяти и размера контекста, который вы держите).для каждого запроса).

Вам необходимо убедиться, что вы отправляете исходящие сетевые запросы неблокирующим образом.Обычно это выглядит так (в вашем обработчике входящих Netty):

CompletableFuture<YourResultType> future = remoteTarget.getStuff();
future.thenApply(ctx::write);

Вам нужно держать ссылку на контекст / канал, если вы, конечно, делаете это вне обработчика.

Обратите внимание, что это упрощенный ответ.Если вы делаете несколько исходящих запросов и имеете некоторую бизнес-логику, вам необходимо правильно сшить код, используя продолжения на фьючерсах или любую другую неблокирующую модель, которую вы используете.

...