Подтвердить что ты не робот

Асинхронные сервлеты и синхронные сервлеты

Так как поддерживается асинхронная обработка сервлетов 3.0. Было бы лучше, всегда использовать асинхронную обработку? Или в каких случаях синхронная обработка лучше?

4b9b3361

Ответ 1

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

Ответ 2

Считая статью, поддержка асинхронной обработки в спецификации Servlet 3.0 имеет очень специфический прецедент - она ​​предназначена для обработки случая, когда у вас есть приложение AJAX, которое делает запросы, которые запускают потенциально длительные процессы в фоновом режиме.

Причина, по которой нам нужно было что-то вроде этого, - это ответить на проблему в модели потока за запрос, которая выделяет поток каждый раз, когда клиент запрашивает страницу с сервера, вместо того, чтобы выделять один поток для всего клиента сессия. Это хорошо работало до AJAX, когда клиенты периодически делали запросы, но преимущества были потеряны, когда приложения AJAX значительно увеличили количество запросов, которые клиент сделал бы.

В частности, если запрос AJAX запускает что-то потенциально медленное или блокирующее, например операцию с базой данных, мы вернулись туда, где мы начали - потоки с сервера threadpool потенциально неактивны.

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

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

Ответ 3

Асинхронная обработка была введена для случаев, когда нет необходимости удерживать поток в течение всего цикла обработки запроса. Типичным примером такого случая является comet-like.

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

Ответ 4

Я просто просмотрел связанную статью, это улучшение на стороне сервера, а не асинхронное на стороне клиента.

Подведение итогов статьи:

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

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

Довольно классный материал.

Ответ 5

Он основан на requrirement, где любые шансы, что поток попадет в незанятое состояние в этой ситуации, u должен использовать Asynchronous Servlet, иначе не beacause из-за того, что мы не можем сделать так много потоков

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

Чтобы включить асинхронную обработку сервлета, установите параметр asyncSupported в true в аннотации @WebServlet следующим образом:

@WebServlet (urlPatterns = { "/asyncservlet" }, asyncSupported = true) Открытый класс AsyncServlet расширяет HttpServlet {...}

Синхронная (классическая модель веб-приложений) Синхронный запрос блокирует клиента до завершения операции, то есть браузер не реагирует. В этом случае блокируется java script движок браузера.

Асинхронный (модель веб-приложения AJAX) Асинхронный запрос не блокирует клиента, то есть браузер реагирует. В это время пользователь может выполнять и другие операции. В этом случае java script движок браузера не блокируется.

В синхронной связи оба одновременно активны, так как в Asynchronous нет необходимости одновременно активировать, например, Asynchronous ссылается на операцию обмена сообщениями на новый поток и запуск потока, связанного с контейнером

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

Существует два распространенных сценария, в которых поток, связанный с запросом, может сидеть без дела.

The thread needs to wait for a resource to become available or process data before building the response. For example, an application may need to query a database or access data from a remote web service before generating the response.

The thread needs to wait for an event before generating the response. For example, an application may have to wait for a JMS message, new information from another client, or new data available in a queue before generating the response.