суббота, 11 июня 2011 г.

Оптимизация взаимодействия веб-клиента и сервера - Сервера приложений (платформы)

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


Сервер приложений (англ. application server) — сервер, исполняющий некоторые прикладные программы. Термин также относится и к программному обеспечению, установленному на таком сервере и обеспечивающему выполнение прикладного ПО.

Ниже мы предпримем небольшой экскурс в историю и познакомимся с первым или одним из первых серверов приложений, который успешно развивался все эти годы и сегодня является мощной и эффективной системой уровня предприятия. Ссылки в основном ведут на англоязычные ресурсы, потому что в рунете практически нет информации о веб-технологиях 1990-х, активно развивавшихся в США. На самом же деле ко времени появления форка довольно примитивного веб-сервера NCSA HTTPd 1.3 под именем Apache в 1995 году уже существовали мощнейшие веб-платформы. А основанная в 1995-м году Полом Грэмом и Робертом Моррисом компания Viaweb была первым SAS (Software-As-Service) провайдером! В 1998-м году эта компания была приобретена Yahoo и превратилась в Yahoo Store.


Для Tcl мощным сервером приложений является AOL Server с многопоточным интерпретатором Tcl и развитым высокоуровневым API, пулом подключений к БД, мощной системой кэширования кода и файлов, пулом процессов-обработчиков HTTP-соединений, поддержкой языка серверных сценариев AOLserver Dynamic Pages и другими возможностями. При этом конфигурационный файл AOL Server является тиклевым скриптом, так что в нем можно использовать переменные, получать параметры конфигурации из любых внешних источников и многое другое. AOL Server разрабатывался в созданной в 1993-м году компании NaviSoft, купленной в 1994 году корпорацией AOL, и в 1999 году AOLserver 3.0 выпущен под open-source лицензией AOLserver Public License, аналогичной Mozilla Public License. Подробнее можно прочитать в статье от 2002-го года Introducing AOLserver. Существует форк проекта AOL Server, который взял исходное название NaviServer, в нем добавлены некоторые интересные возможности.


Совместно с сервером приложений для разработки может использоваться и один из фрэймворков:

Каркас (англ. framework) — в информационных системах структура программной системы; программное обеспечение, облегчающее разработку и объединение разных компонентов большого программного проекта. В его состав могут входить вспомогательные программы, библиотеки кода, язык сценариев и прочее.


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


Для AOL Server известным фрэймворком является OpenACS, есть и другие. OpenACS является открытой системой, построенной на кодовой базе одной из первых enterprize систем управления веб-контентом ArsDigita Community System, или, сокращенно, ACS. Да-да, от легендарной ArsDigita Corporation, о которой с восхищением пишет Джоель Спольски в статье Весна в Кэмбридже. В OpenACS добавлена поддержка СУБД PostgreSQL, тогда как ACS работал только с СУБД Oracle. В 2001 году после краха доткомов ArsDigita находилась в сложном положении, и было принято решение создать Java EE версию ACS, а в 2002 году компания Red Hat купила ArsDigita и продолжила разработку платформы ACS на Java EE под именем Red Hat CCM, в то время как Tcl-версия была переименована в OpenACS и управляется OpenACS community. В настоящее время многие крупные сайты работают именно на AOL Server + OpenACS, в том числе учебный процесс и сайты многих университетов управляются известной системой для электронного образования www.dotlrn.org


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


Теперь подробнее рассмотрим сервер приложений AOL Server и начнем с его установки. В debian-based дистрибутивах установка выполняется с помощью пакетного менеджера apt, в других дистрибутивах есть свои менеджеры пакетов.

sudo aptitude install aolserver4

Подготовительные действия по инициализиции веб-приложения и загрузке вспомогательных библиотек теперь не требуется выполнять для каждого запроса заново - эти действия можно выполнить единожды в скрипте инициализации. В конфигурации по умолчанию в debian-системах это должен быть файл с произвольным именем и расширением tcl в директории /usr/lib/aolserver4/servers/main/modules/tcl/tcl_module/, мы назовем его init.tcl:


/usr/lib/aolserver4/servers/main/modules/tcl/tcl_module/init.tcl

package require sqlite3
Здесь мы загрузили библиотеку для работы с базами данных формата SQLite3.

Запускаем сервер с конфигурационным файлом по умолчанию (из debian-пакета):

$ sudo /etc/init.d/aolserver4 restart

При старте будет загружен созданный нами файл init.tcl и указанная в нем библиотека станет доступна всем скриптам.


Пример. Простая страница.


В динамических страницах AOL Server содержимое тэгов <% ... %> интерпретируется как Tcl код, а все прочее считается HTML разметкой. Так что от нас потребуется лишь в нужном месте HTML страницы вставить Tcl код:


/var/www/index.adp

<HTML><BODY>
<h1>Привет, мир! Сейчас <%=[clock format [clock seconds]]%></h1>
</BODY></HTML>"

Проверяем, что наша страничка корректно создается:

$ openload -t localhost/index.adp
URL: http://localhost:80/index.adp
Clients: 1
------------------------
Status: 200
---- Headers -----------
Expires: now
MIME-Version: 1.0
Date: Sat, 03 Jul 2010 05:56:16 GMT
Server: AOLserver/4.5.1
Content-Type: text/html; charset=UTF-8
Content-Length: 123
Connection: close
---- Body   123 bytes --
<HTML><BODY>
<h1>Привет, мир!</h1>
</BODY></HTML>
---- End ---------------
Можно это и в браузере посмотреть, зайдя на адрес локального сервера http://localhost

Пример. Работа с БД SQLite3.


Создадим тестовую базу:

echo "create table log(date REAL NOT NULL DEFAULT (julianday('now'))); \
CREATE INDEX log_date_idx ON log(date);" | sqlite3 /tmp/www.db
chmod a+rw /tmp/www.db 

Создадим скрипты для вставки новой записи:


/var/www/write.adp

<%
sqlite3 db /tmp/www.db
db timeout 2000
db eval {insert into log default values}
set rowid [db onecolumn {select last_insert_rowid()}]
ns_adp_puts "Inserted new record ROWID=$rowid"
db close
%>

и для чтения времени последней добавленной записи:


/var/www/read.adp

<%
sqlite3 db /tmp/www.db
db timeout 2000
set lasttime [db onecolumn {select datetime(max(date)) from log}]
ns_adp_puts $lasttime
db close
%>

Команда db timeout 2000 указывает, что в случае, когда в БД заблокирована (производится запись из другого потока), следует подождать освобождения БД, но не более 2-х секунд (т.е. 2000 миллисекунд), а не возвращать сразу же ошибку доступа к БД. В AOL Server есть пулы соединений, предоставляющие единый интерфейс доступа к разным СУБД, но здесь используем более простой способ, открывая новое соединение к БД на каждый запрос.


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

Комментариев нет:


(C) Alexey Pechnikov aka MBG, mobigroup.ru