GraniteDS и асинхронные сервлеты
GraniteDS, насколько мне известно, единственное решение, которое реализует асинхронные сервлеты для обмена сообщениями в реальном времени, т.е.передача данных.Эта функция доступна не только для контейнеров Servlet 3 (Tomcat 7, JBoss 7, Jetty 8, GlassFish 3 и т. Д.), Но также для более старых или других контейнеров с определенной асинхронной поддержкой (например, Tomcat 6 / CometProcessor, WebLogic 9 + / AbstractAsyncServletи т. д.)
Другие решения не имеют этой функции (BlazeDS) или не используют RTMP (LCDS, WebORB и последнюю версию Clear Toolkit).Я не могу сказать много о реализациях RTMP, но в BlazeDS явно отсутствует масштабируемая реализация обмена сообщениями в режиме реального времени, поскольку она использует только модель синхронного сервлета.
Если вам нужно обрабатывать много тысяч одновременно работающих пользователей, вы можете даже создатькластер серверов GraniteDS для дальнейшего повышения масштабируемости и надежности (см., например, это видео ).
Производительность асинхронных сервлетов
Масштабируемость асинхронных сервлетов по сравнению с классическимиСервлеты были протестированы несколько раз и дают впечатляющие результаты.См., Например, этот пост в блоге Jetty:
При использовании сервера без NIO или без Continuation для этого потребуется около 11 000 потоков.обрабатывать 10000 одновременных пользователей.Jetty обрабатывает это количество соединений только с 250 потоками .
Классическая синхронная модель:
- 10 000 одновременных пользователей -> 11 000 серверных потоков.
- 1.1 коэффициент.
Асинхронная модель кометы:
- 10000 одновременных пользователей -> 250 потоков сервера.
- 0.025 коэффициент.
Такое соотношение можно примерно ожидать от других асинхронных реализаций (не Jetty), и использование Flex / AMF3 вместо простого HTTP-запроса HTTP не должно сильно влиять на результат.
Почему асинхронныйСервлеты?
Классическая (синхронная) модель сервлетов приемлема, когда каждый запрос обрабатывается немедленно:
request -> immediate processing -> response
Проблема с передачей данных заключается в том, что не существует такой вещи, как настоящие "данныеpush "с протоколом HTTP: сервер не может инициировать вызов клиента для отправки данных, он должен ответить на запрос .Вот почему реализации Comet основаны на другой модели:
request -> wait for available data -> response
При синхронной обработке сервлета каждый запрос обрабатывается одним выделенным серверным потоком.Однако в контексте принудительной обработки данных этот поток большую часть времени просто ожидает доступных данных и ничего не делает, потребляя значительные ресурсы сервера.
Все назначение асинхронной обработки состоит в том, чтобы позволить контейнеру сервлета использоватьэти (часто) незанятые потоки для обработки других входящих запросов, и поэтому вы можете ожидать существенных улучшений в плане масштабируемости, когда вашему приложению требуются функции обмена сообщениями в реальном времени.
В Интернете можно найти множество других ресурсов.объясняя этот механизм, просто погуглите на комете.