Статьи

Jetty 6.0 для предоставления новой архитектуры для приложений AJAX

Приложения AJAX, веб-сайты, которые взаимодействуют с сервером в фоновом режиме для обновления отображаемых страниц на лету, все чаще представляют новую проблему для веб-серверов, которые не были разработаны с учетом AJAX. Облегченное программное обеспечение Jetty Java Web-сервера предлагает новую AJAX-дружественную архитектуру, чтобы такие приложения могли поддерживаться без перегрузки сервера трафиком.

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

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

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

До настоящего времени веб-серверы обычно создавались на основе модели «один поток на запрос», чтобы сервер выделял ресурсы для каждого активного запроса, чтобы сгенерировать ответ на этот запрос. В веб-приложении, не поддерживающем AJAX, эта модель может поддерживать практически неограниченное количество активных пользователей, при условии, что только управляемое количество этих пользователей отправляет запросы в любой момент времени.

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

Инновационное решение этой проблемы испытывается в текущей версии Jetty 6.0 для Alpha 3 . Новая функция, называемая Continuations, позволяет веб-приложению «удерживать» запрос, чтобы оно не потребляло никаких ресурсов, пока приложение не будет подготовлено для ответа на него.

Сначала я немного опасался этой, по общему мнению, крутой идеи. Официальный API Java Servlet, с которым Jetty так тщательно соблюдает, не предусматривает нарушения таким образом модели потока на запрос. Поскольку разработка Java Web основана на принципах межсерверной совместимости, я боялся, что принятие нестандартной функции, подобной этой, действительно может быть очень разрушительным.

Как выяснилось, команда Jetty заслуживает большего уважения, чем я. При разработке Continuation API любой совместимый со стандартами веб-сервер Java (то есть все они) просто остановится и будет ожидать события в потоке для «постоянного запроса», как обычно. На Jetty 6.0, однако, Continuation фактически вызовет сбой запроса, за исключением того, что Jetty отловит его внутренне, поместив запрос в очередь. Эта ошибка освобождает поток, ответственный за запрос (таким образом, решая проблему загрузки запроса), но сохраняет запрос в файле до тех пор, пока веб-приложение не пожелает уведомить клиентов о событии, после чего любые «постоянные запросы» в файле возвращаются к жизни и обрабатывается с нуля, как будто они только что были получены.

С точки зрения браузера, все это прозрачно. «Постоянный запрос» отправляется, и сервер отвечает на него, когда на сервере происходит событие.

Грег Уилкинс, ведущий разработчик Jetty, подробно описывает новый API Continuations в своем блоге и упоминает, что он представит эту функцию для включения в официальный API сервлетов 3.0, если отзывы разработчиков будут благоприятными.