Асинхронная обработка запросов в веб-приложении Java
Мне нужно написать веб-приложение, которое получает много HTTP-запросов и занимает много времени (от 30 секунд до 2 минут), чтобы обработать каждый запрос (в свою очередь делая другие сетевые запросы), прежде чем возвращать ответ.
Поскольку будет поступать много запросов, и эти соединения остаются открытыми, я думаю о том, чтобы идти по маршруту, управляемому событиями, что заставляет меня думать, что Нетти уместен.
Если для обработки каждого запроса требуется много времени, это блокирует обработку netty? Или я могу получить запрос и затем асинхронно обработать его, прежде чем вернуть результат в соединение запроса?
1 ответ
Пока вы не заблокируете цикл обработки событий, вы сможете обслуживать значительное количество одновременных запросов (в зависимости от доступной памяти и размера контекста, который вы держите для каждого запроса).
Вам нужно убедиться, что вы отправляете исходящие сетевые запросы неблокирующим образом. Обычно это выглядит так (в вашем обработчике входящих Netty):
CompletableFuture<YourResultType> future = remoteTarget.getStuff();
future.thenApply(ctx::write);
Вы должны держать ссылку на контекст / канал, если вы, конечно, делаете это вне обработчика.
Обратите внимание, что это упрощенный ответ. Если вы делаете несколько исходящих запросов и имеете некоторую бизнес-логику, вам необходимо правильно сшить код, используя продолжения на фьючерсах или любую другую неблокирующую модель, которую вы используете.