Асинхронная обработка запросов в веб-приложении Java

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

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

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам