Pull to refresh

Caucho Resin — сервер приложений Java/PHP

Reading time6 min
Views6.4K
Для приложений Java, я имею ввиду, веб-приложений, существует уже достаточное количество серверов, которые уже давно разрабатываются и давно вышли на уровень, достаточный для того, чтобы применять их в самых сложных и ответственных случаях. Думаю, всем знают Apache Tomcat и Jetty — самые известные сервера из списка открытых разработок. Но к этому списку нужно добавить теперь еще и Caucho Resin. В ряде тестов его Pro версия превосходит в производительности Tomcat 6, обладая при этом рядом возможностей «из коробки», которых нет в других серверах или они реализуются при помощи сторонних средств.

И так, Resin — высокопроизводительный HTTP и сервер приложений для Java/PHP приложений, с возможностью масштабироваться и кластеризироваться в начальной конфигурации. Кстати, именно в этом состоит различие между обычной, open-source версией и Pro. В этой версии есть функции автоматического детектирования остановившихся или зависших сессий и рестарта сервера, а также средства мониторинга состояния JVM и потребления памяти. Кластеризация позволяет распределить нагрузку на несколько серверов, при этом сессии будут привязаны к конкретному серверу и мигрируют в фоновом режиме при крахе обслуживающей его ноды. Об этом стоит как то поговорить отдельно, возможно, в отдельной статье — я собираюсь плотно занятся изучением этого сервера и его возможностей, а результат буду публиковать в виде статей.


Особенностью Resin-а в плане производительности является использование нативного кода для основной функциональности сервера, в частности, для работы с сокетами и файловой системой. Сервер работает на Linux и Win32 системах, и для каждой из них свой код, что позволяет использовать все возможности сервера. Хотя большая часть сервера написана на Java и работает поверх JVM.

Поддержка SSL является обязательной для современного сервера, поэтому поддержка библиотеки OpenSSL даже не стоит рассматривать — это и так ясно. А вот встроенная система кеширования выгодно отличает Resin от других серверов, которым надо дополнительные компоненты или сторонние приложения. Сервер может кешировать в памяти часто запрашиваемые страницы или использует кеш для статических данных вроде изображений. Часть кеша используется для кеширования внутренних обьектов, избегая нагрузки на базу данных. Конечно, для серьезных приложений необходимо использование мощных независимых решений, вроде уже описанного нами EHCache, однако на начальном этапе используя Resin мы получим сразу все необходимые возможности, которые в будущем сможем расширять.

В сервер встроена еще одна, по истине уникальная возможность (как для таких серверов) — встроенный пул коннектов для доступа к базам данных, поддерживающий любые JDBC-драйвера, использующий балансировку нагрузки (по алгоритму round robin) и механизм восстановления после сбоев. Хотя это не отменяет использование сторонних, более мощных средств для кластеризации баз данных, однако сразу с коробки даст более чем широкие возможности для любых приложений.

Аналогично Jetty, Resin поддерживает технологию (или протокол) Comet для реализации Server-Push. Это особенно важно для реализации различных современных web 2.0 сервисов, например, веб-чатов и других коммуникационных приложений. В активах Caucho, компании-разработчика, есть еще проект Hessian — двоичный формат и протокол для быстрой передачи данных между компонентами веб-сервисов или приложениями, аналог XML, SOAP или JSON, и если вы используете в клиентской части (на JavaScript или Flash) соответствующую библиотеку, то сможете использовать этот, более быстрый протокол (подробнее описано здесь).

И так, об архитектуре. Сам сервер приложений может работать на платформах Win32, MacOS, Sun Solaris и Linux (на FreeBSD есть или были ранее проблемы с JDK). В состав пакета входит собственный HTTP-сервер, однако предусмотрена работа с внешним веб-сервером, в частности, Apache или IIS, а также с любым сервером через CGI. Я считаю, что работа в паре с Apache или, что еще лучше, с nginx — самая предпочтительная конфигурация для нагруженных проектов, эти сервера возьмут себе обработку статичных файлов и даже начальную балансировку нагрузки (nginx), а запросы, требующие обработки, передаются на Resin. Он по умолчанию работает на порту 8080, но это, конечно, настраивается отдельно, если нет других сервером, можно использовать и встроенный, переведя его на привычный 80 порт.

Сам Resin исполняется поверх Java Virtual Machine, и в этом кроется его сила (об этом поговорим чуть ниже). Для связи с базами данных используется вся мощь java-технологий и интерфейс JDBC. Вот и все. Стоит лишь рассказать о поддерживаемых технологиях для Java-приложений. Я не сильный специалист в многообразии Java-мира, поэтому только перечислю: WebBeans (JSR-299), EJB 3.0, Java Server Page (JSP 2.1), Java Standard Template Library (JSTL 1.0.1), Servlet 2.5, Java Persistence Architecture (JPA), Messaging API 1.1, Transaction 1.0.1b, JNI и другие. Все это позволяет полностью использовать все наработки и сторонние приложения, уже написанные и работающие в других серверах.

А теперь, на последок, самое важное и интересное (для меня и, надеюсь, для вас) — собственно, из-за чего эта статья или даже цикл статей, и затевались. Ведь сам по себе сервер Java-приложений не самое новаторское и интересное, верно? Пусть даже с такими возможностями.

В начале статьи я упомянул, что Resin — сервер для Java/PHP приложений. РНР? Верно — в активах компании Caucho есть ПОЛНЫЙ порт РНР и основных библиотек на язык Java — Quercus! И не просто порт, а полнофункциональный сервер приложений для РНР на основе Java. И он входит в состав Resin-а, хотя доступен и в качестве самостоятельного модуля. Quercus написан полностью на Java и содержит не только базовый функционал PHP-core, но и целый ряд популярных расширений — PDO, JSON, PDF, APC, iconv, GD, gettext. Это позволяет запускать большинство из популярных РНР-проектов, включая CMS -системы без какой-либо переделки (только заменив параметры доступа к базе данных). В тестах заявлено, что популярная CMS-система Drupal, запущенная на сервере Resin, показывает до 4-х кратного увеличения производительности.

Но самое важное совсем не это. А то, что приложение на РНР, запущенное в такой среде, автоматически получает все, повторяю, все возможности Java-платформы, и того же сервера Resin, что и описаны выше. Помните, про кластеризацию, динамическая миграция сессий между нодами кластера, пул коннектов к базе данных (именно это очень и очень важно, эту тему я уже поднимал в своем первом исследовании, и только сейчас нашел способ это реализовать), а также доступ ко всем Java-приложениям и компонентам системы. Вместе с этим, вы пишете обычный свой код, на привычном и знакомом вам языке РНР. Или даже не пишете ничего, просто конфигурируете Resin и запускаете поверх него свой проект, сразу значительно расширяя его возможности и производительность. А ведь для самого Resin-а также доступны все средства для управления и масштабирования Java-приложений, которых есть на рынке не так и мало, многие протестированы и используются в самых масштабных проектах.

Кстати, вы думаете, это такая уникальная технология, которую я откопал исключительно, чтобы исследовать и забросить? А как вам тот факт, что один из крупнейших сайтов Рунета, социальная сеть Одноклассники.ру работает именно на сервере приложений Resin (2.1.16)? Это говорит о зрелости и востребованности технологии, как для традиционного рынка Java, так и на рынке PHP. Некоторые возможности присутствуют в Zend Platform, к примеру, кластеризация и перенос сессий, мониторинг производительности и балансировка нагрузки, однако Resin кроме этого предоставляет намного больше, да и по стоимости он куда привлекательнее. Сравните — 500 USD за процессорную лицензию за Resin и от 999 USD за Zend Platform. При этом любопытно, в составе Platform-а есть компонент Java Bridge, который отвечает за интеграцию и взаимодействие с Java-приложениями и веб-сервисами. Видимо, даже главная РНР-компания и разработчик коммерческих продуктов на/для РНР понимает и хочет использовать мощь и широту возможностей из Java мира, одновременно не заставляя переучиваться и менять язык РНР-разработчиков.

Вот и все, краткое введение в тему закончено, я приступаю к тщательному изучению возможностей Resin-а и немного Java вообще, поэтому в дальнейшем будет еще не одна статья на эту тему, уже правда более конкретные и практичные. Первым делом я попытаюсь настроить пул коннектов к базе данных и, возможно, попробую запустить РНР приложение, которое будет использовать доступ к базе данных через какой-либо другой стек доступа, например, lbpool или Continuent Tungsten. Попробую рассмотреть также независимые средства для кластеризации Java-приложений, например, Terracotta.

P.S. Оригинал статьи написан для моего личного блога: Alpha-Beta-Release Blog
Tags:
Hubs:
+5
Comments8

Articles

Change theme settings