nodeJS Быстрый веб-сервер на javascript движке V8

22Мар/102

Node.js – стиль и фреймворки

После PHP писать для Node приятно. Конечно, это дело субъективное, но лично мне JavaScript теперь кажется куда более подходящим языком для Web-приложений. Добавьте сюда то что теперь один язык можно использовать и на клиенте, и на сервере. К тому же стиль программ (event-driven) уже знаком большинству веб-программистов из опыта клиентского JavaScript.

Стиль программирования

Если Вам случалось писать PHP-скрипты под FastCGI, стиль Node тоже должен показаться Вам знакомым. И в том и в другом случае на сервере крутится один скрипт, выполняя запросы последовательно. Правда, настоящий FastCGI интерфейс для Node пока в стадии разработки. Он даст ещё несколько возможностей – например, позволит подключать стандартные балансировщики нагрузки.

JavaScript изначально более приспособлен для асинхронных вызовов, чем PHP. Например, вот так может выглядеть URL router/matcher:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var app = [
    // этот коллбек будет отвечать только на GET-запросы
    [get(/^\/hello\/(\w+)$/), function(req, res, name) {
 
        // сессия доступна в каждый вызов
        req.session["name"] = name;
 
        // respond получает строку и выставляет дефолтные заголовки:
        // Content-Type: text/html, Content-Length: длина строки
        res.respond("Hello, " + name + "!");
 
    }],
 
    // Этот коллбек будет отвечать на любой метод
    [/^\/goodbye$/, function(req, res) {
 
        var name = req.session["name"];
        var message = "Goodbye, " + (name || "I hardly knew thee") + "!";
 
        // respond получает объект, состоящий из контента и заголовков
        // подставляя дефолтные значения для не указанных
        res.respond({content: message, headers: {"Content-Type": "text/plain"}});
 
    }]
 
];

Т.е. просто набор регулярных выражений с callback’ами. Этот кусок взят из руководства к фреймворку nerve для Node. Nerve пока тоже в процессе создания, но уже позволяет сделать небольшой сайт без особых усилий. Во фреймворке присутствуют роутер URL, базовая работа с сессиями и cookies, возможности для создания SSL-сайтов и шаблонизатор.

Шаблонизаторы

Шаблонизаторы для Node обычно действуют по одному и тому же принципу: преобразовывают шаблон к функции, принимающей аргументы шаблона, эдакий карринг. Плюсы такого подхода очевидны: V8 скомпилирует функцию в очень быстрый код, который вполне можно положить в общую память и не компилировать для каждого запроса в отдельности. В PHP для этого есть Smarty, но Node+nerve имхо для этого удобнее — изучить как следует один язык гораздо легче чем два. В случае Smarty же приходится изучать ещё и его синтаксис, в дополнение к PHP.

Можно конечно использовать шаблонизаторы с синтаксисом, отличным от JavaScript, основанные исключительно на тексте — например шаблонизатор, предоставляемый библиотекой Underscore.

Хранение данных

Вообще общая память в Node — самое естественное место для хранения небольших данных. Она не копируется для каждого подключения, данные в неё можно положить данные один раз при запуске скрипта и т.д. Конечно, страницы сайта удобнее хранить в каком-либо хранилище типа Redis, для которого уже сделан коннектор к Node.

Кроме того, из Node можно подключаться к MySQL с помощью DBSlayer — уровня абстракции БД, написанного на C специально для конкурентных веб-приложений.

Производительность

Замерять производительность Node в сравнении с Rhino пока не очень получилось — возникли трудности с установкой Java на виртуалку :) Предварительные результаты: для Node в виртуальной машине и Rhino на обычной разница примерно в 6-7 раз, но это для единовременного выполнения скрипта. В случае обработки серии запросов Rhino будет ещё больше отставать из-за времени, необходимого на запуск JVM. Посмотрим, возможно получится как то запустить его в таком же режиме как Node.

Источник: Механический мир

Комментарии (2) Пинги (0)
  1. Я могу ошибаться, но вряд ли старт JVM в Rhino осуществляется каждый запрос.

  2. Rhino это просто виртуальная машина. Стартовать его каждый раз или нет – вопрос архитектуры веб-сервера. Narwhal вроде висит в памяти и обрабатывает запросы по мере поступления.


Оставить комментарий


Нет обратных ссылок на эту запись.