В большинстве ситуаций при обработке запросов вы блокируете или ожидаете какой-то внешний ресурс/условие. В этом случае вы занимаете поток (следовательно, много памяти), не выполняя никакой работы.
С сервлетом 3.0 вы можете обслуживать тысячи одновременных соединений, намного больше, чем доступных потоков. Подумайте о приложении, которое обеспечивает загрузку файлов с ограниченной пропускной способностью. Большую часть времени ваши потоки простаивают, потому что они ждут отправки следующего фрагмента данных. В обычных сервлетах вы не можете обслуживать больше клиентов, чем количество ваших потоков HTTP, даже если большую часть времени эти потоки бездействуют/спят.
В сервлете 3.0 вы можете иметь тысячи подключенных клиентов с несколькими потоками HTTP. Вы можете найти реальный пример в моей статье: Десятикратное увеличение в пропускной способности сервера с асинхронной обработкой Servlet 3.0, вдохновленной этим вопросом: ограничить пропускную способность/скорость загрузки файла в Servlet
Является ли поток, созданный startAsync, как-то дешевле?
Нет тем, созданных startAsync
! Он просто сообщает контейнеру сервлета: эй, хотя метод doGet
/doPost
завершен, я еще не закончил с этим запросом, пожалуйста, не закрывайте. В этом весь смысл - вы, вероятно, не будете создавать новый поток для каждого асинхронного запроса. Вот еще один пример: у вас есть тысячи браузеров, ожидающих изменения курса акций, используя комета. В стандартных сервлетах это означало бы: тысячи бездействующих потоков, ожидающих некоторого события.
С сервлетом 3.0 вы можете просто держать все асинхронные запросы в ожидании в ArrayList
или некоторой очереди. Когда поступит изменение цены акции, отправьте его всем клиентам один за другим. В этом сценарии требуется не более одного потока, и все потоки HTTP могут свободно обрабатывать оставшиеся ресурсы.
person
Tomasz Nurkiewicz
schedule
08.04.2012