Продолжается подписка на наши издания! Вы не забыли подписаться?

Пересекая границы: Continuation, Web-разработка и Java-программирование

Авторы: Брюс Тэйт
RapidRed
Опубликовано: 20.10.2008

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

Появление Web

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

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

Появление Web-разработки

Взрывообразное распространение Web-разработки произошло в середине 1990-х годов. С появлением языка программирования Java стало возможным создавать распределенные Web-приложения и одновременно решать наиболее серьезные проблемы технологии клиент-сервер при помощи новых возможностей:

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

Не утопия

Одно простое слово stateless (не запоминающий состояния) переложило огромный груз с системы на плечи разработчика. Выгоды даже не обсуждаются: вы получаете фантастическую масштабируемость, поскольку не должны поддерживать одну службу или сервлет для каждого пользователя. Но бремя управления состоянием было переложено с языка программирования на разработчика. Сегодня вы можете рассматривать Web-разработку как последовательность не сохраняющих состояния запросов (см. рисунок 1).


Рисунок 1. Web-приложения выполняют пары запрос/ответ.

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

Сохранение состояния обычно реализуется помещением всех данных, относящихся к взаимодействию с пользователем, в сессию, и отметкой этой пользовательской сессии на клиентском компьютере с использованием куки (cookie), скрытых полей или URL-переменных. Для каждого нового запроса вы вынуждены выполнять следующие действия:

Я очень упростил проблему, поскольку использование stateless-модели для эмуляции statefull-приложений может вызвать еще более серьезные проблемы. Самый важный вопрос также стар, как и Web-разработка: как обработать кнопку "Назад" (Back)?

Новые ответы на старые вопросы

Вас может шокировать возможность создания Web-приложения, использующего с точки зрения пользователя stateless-модель, однако для программиста выглядящее как statefull. На самом деле еще в 1995 году в книге "Хакеры и художники" (см. раздел "Ресурсы") Пол Грэхэм (Paul Graham) говорил о применении такого подхода в ViaWeb. Этот подход использовал программную управляющую структуру, называемую continuation (по-русски этот термин стоило бы переводить как возобновление, но в Рунете его часто переводят как продолжение – прим.ред.).

Основная идея заключается в следующем: вы можете позволить фреймворку загрузить состояние вашего приложения перед запросом и сохранить состояние вашего приложения после каждого запроса. Я начну с рассмотрения continuation в языке программирования Ruby.

Ruby-пример

Если вы хотите самостоятельно запустить эти примеры, установите Ruby и выполните команду irb. Определите метод под названием loop, введя команды после символа >, как показано в листинге 1:

Листинг 1. Создание метода loop

irb(main):001:0> def loop(interrupt)
irb(main):002:1> for i in 1..10
irb(main):003:2> puts "Value of i: #{i}"
irb(main):004:2> callcc {|c| return c} if i == interrupt
irb(main):005:2> end
irb(main):006:1> end
=> nil

...

Ближайшее будущее

Вы можете заметить, что continuations представляют собой реальный прогресс в Web-фреймворках. Этот подход позволяет реально повысить производительность. А поскольку Web-приложение выражается в виде понятного Java-кода (вместо сотен разъединенных сервлетов), приложения становится намного легче понять и поддерживать.

Новые достижения в Web-разработке быстро делают continuation-подход все более важным. Вместо выборки полных Web-страниц в традиционных моделях запрос/ответ, Ajax-приложения могут асинхронно выбирать маленькие фрагменты Web-страницы и вставлять результаты в существующую страницу. Но Ajax-приложения вынуждают поддерживать соединение с пользователем длительный период времени, для того чтобы сохранить "отзывчивость" приложения и легкость кодирования системы отслеживания состояния. Такой режим работы лишает смысла stateless-программирование, поскольку вы действительно должны удерживать ресурсы для каждого подключенного пользователя. Используя continuation, вы можете сохранять состояние в них и восстанавливать состояние при необходимости.

В ближайшем будущем развитие аппаратного обеспечения сделает дополнительные затраты ресурсов на continuation менее существенными (агащазблин – прим.ред.). Без полного пересмотра Web-фреймворки все равно будут слишком сложными. Ajax предвещает еще большее усложнение Web-разработки. Все эти факторы неуклонно приведут к использованию continuation-сервера. Через два года большинство новых Web-разработок будет использовать какой-либо continuation-сервер или какую-либо эмуляцию continuations.

Ресурсы


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

Copyright © 1994-2016 ООО "К-Пресс"