The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Релиз серверной JavaScript-платформы node.js 0.4

15.02.2011 22:36

Вышел второй стабильный релиз платформы node.js 0.4 (нечетные ветки - экспериментальные, а четные (0.2, 0.4) - стабильные), позволяющей создавать высокопроизводительные сетевые приложение на языке JavaScript. Для обеспечения обработки большого числа параллельных запросов node.js использует для запуска кода асинхронную модель, основанную на обработке событий в неблокирующем режиме и определении callback-обработчиков. По своей сути node.js похож на фреймворки Ruby Event Machine и Python Twisted, но цикл обработки событий (event loop) в node.js скрыт от разработчика и напоминает обработку событий работающим в браузере web-приложением, при этом функции платформы не ограничены web и поддерживают создание обычных сетевых клиентских и серверных программ.

В качестве способов мультиплексирования соединений поддерживается epoll, kqueue, /dev/poll и select. Для обеспечения выполнения JavaScript-кода используется разработанный компанией Google движок V8. Для мультиплексирования соединений используется библиотека libev, для создания пула потоков (thread pool) задействована библиотека libeio, для выполнения DNS-запросов в неблокирующем режиме интегрирован c-ares. Все системные вызовы, вызывающие блокирование, выполняются внутри пула потоков и затем, как и обработчики сигналов, передают результат своей работы обратно через неименованный канал (pipe).

Для расширения функциональности приложений на базе node.js подготовлена большая коллекция модулей, в которой можно найти модули с реализацией HTTP/SMTP/XMPP/DNS/FTP/IMAP/POP3 серверов и клиентов, модули для интеграции с различными web-фреймворков, WebSocket и Ajax обработчики, коннекторы к СУБД (MySQL, PostgreSQL, SQLite, MongoDB), шаблонизаторы, CSS-движки, реализации криптоалгоритмов и систем авторизации (например, OAuth), XML-парсеры.

При написании приложений для node.js необходимо учитывать специфику событийно-ориентированного программирования, например, вместо выполнения "var result = db.query("select..");" с ожиданием завершения работы и последующей обработкой результатов, в node.js использует принцип асинхронного выполнения, т.е. код трансформируется в "db.query("select..", function (result) {обработка результата});", при котором управление мгновенно перейдет к дальнейшему коду, а результат запроса будет обработан по мере поступления данных. Ни одна функция в node.js не должна напрямую выполнять операции ввода/вывода - для получения данных с диска, от другого процесса или из сети требуется установка callback-обработчика.

Из новшеств node.js 0.4 можно отметить:

  • Значительная переработка систем для организации шифрованных каналов связи (TLS/SSL), расширение функциональности и упрощение API. Вместо излишне завязанного на сокеты кода для связи с OpenSSL, теперь для каждого соединения создается два потока - дуплексный шифрованный поток (работает через TCP raw-сокет, используя метод Stream.prototype.pipe()) и дуплексный поток для данных, передаваемых открытым текстом;
  • Упрощенный API HTTP-клиента c поддержкой пула соединений;
  • Более легковесный код для выделения памяти под буферы (объект Buffer). Для ухода от проблем с медленным выделением памяти и трудностями с уборкой мусора, осуществлен уход от ObjectWrap к обычным javascript-объектам, что положительно сказалось на производительности;
  • С целью улучшения поддержки пакетных менеджеров добавлены некоторе изменения в код, связанный с загрузкой модулей. В частности, в NPM добавлена поддержка поиска пакетов в предопределенной директории node_modules/; улучшено распознавание относительных путей в модулях, загруженных при использовании символических ссылок; в require() добавлен простейший разбор параметров package.json, что позволило обеспечить прямую работу с директорией пакета;
  • Представлена начальная поддержка сборки для платформы Windows;
  • Произведено обновление JavaScript-движка V8 до версии 3.1.2, в которой интегрирована новая инфраструктура компиляции и добавлен GDB-плагин для Linux.
  • Добавлен новый встроенный клиент для отладчика V8;
  • Добавлен модуль "os", в котором предоставлен набор полезных функций для извлечения информации о системе, например, os.cpus(), os.freemem(), os.totalmem() и os.loadavg().


  1. Главная ссылка к новости (http://nodejs.org/v0.4_announc...)
  2. OpenNews: CommonJS -движение за использование JavaScript вне браузера
  3. OpenNews: Разбор стратегий организации ввода/вывода
  4. Почему Google V8 пока не подходит для встраивания в серверы
  5. OpenNews: JavaScript реализации Ruby, выполненная в V8 VM, оказалась быстрее интерпретатора Ruby
  6. OpenNews: В движке V8 появилась новая подсистема JIT-компиляции JavaScript-кода
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/29616-node.js
Ключевые слова: node.js, javascript, v8, event
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (31) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, tallman (?), 00:17, 16/02/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    кажись жаббер сервер вконтакте на этом написан.
     
     
  • 2.14, AsphyX (ok), 15:07, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Да
     

  • 1.2, Остров (?), 00:17, 16/02/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Все хорошо, но событийная модель может тихо взорвать мозг. Уж лучше эрланго-функциональная.
     
  • 1.3, User294 (ok), 00:31, 16/02/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Судя по графику, nginx kicks an ass :))). Правда он не сервер приложений, но все-таки :)
     
     
  • 2.4, anonymous (??), 00:50, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Судя по графику, при количестве подключений больше 300 у ноды проблемы, поэтому авторы постеснялись сделать шкалу пошире.
     
     
  • 3.5, Аноним (-), 08:14, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ага, на экспоненту смахивает
     
  • 3.12, СуперБизон (??), 11:48, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +1 +/
    на графике нода 0.1
    а статья уже про ноду 0.4
     
     
  • 4.20, User294 (ok), 20:33, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > на графике нода 0.1
    > а статья уже про ноду 0.4

    Хренасе! А это так и надо - написать про 0.4, снабдив статью графиком от 0.1? oO

     
     
  • 5.23, Аноним (-), 21:41, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    >> на графике нода 0.1
    >> а статья уже про ноду 0.4
    > Хренасе! А это так и надо - написать про 0.4, снабдив статью
    > графиком от 0.1? oO

    Там все завязано на libevent, поэтому график в основном её производительность показывает. Скорее всего для 0.4 будет примерно такой-же график, там в плане скорости обработки Hello Word мало что изменилось. Если более сложные программы тестировать различия действительно будут заметны, но тогда некорректно будет с nginx сравнивать.

     
  • 2.28, nagual (ok), 14:38, 18/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > Судя по графику, nginx kicks an ass :))). Правда он не сервер
    > приложений, но все-таки :)

    Всегда интересно смотреть на сравнение мягкого с пушистым ... :-)))

     
  • 2.31, nuclight (ok), 16:36, 21/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > Судя по графику, nginx kicks an ass :))). Правда он не сервер
    > приложений, но все-таки :)

    294, nginx же не под GPL, да, впрочем, и node.js тоже. Как ты можешь их юзать?..

     

  • 1.6, _Vitaly_ (ok), 08:40, 16/02/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Кто бы научил встроенным отладчиком пользоваться?
     
  • 1.7, cmp (ok), 09:24, 16/02/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Результат теста производительности для выражения
      for(i=0;;i++)
          print(i);
    и его аналогов за 2 секунды

    bash      30.000
    node      33.000
    php5     215.000
    js     1.091.000 (http://www.ngs.fi/js/)
    gcc(с) 2.885.000

     
     
  • 2.8, _Vitaly_ (ok), 10:19, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Код в студию, чем печатали в ноде.
     
  • 2.9, Shura (??), 10:50, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    А на результаты perl можно посмотреть?
     
  • 2.11, bav (?), 11:16, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > print(i);

    Годный вброс.

     
  • 2.13, Аноним (-), 14:43, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Дорогие ребята. Сравнивая производителность принтов в различных языках вы не сравниваете языки. Вы сравниваете только принты. Ну и распечатка приведённого листинга заменяет направление на приём к психиатру.
     
  • 2.21, User294 (ok), 20:39, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > bash      30.000
    > node      33.000
    > php5     215.000
    > js     1.091.000 (http://www.ngs.fi/js/)
    > gcc(с) 2.885.000

    Вы имхо проверили в основном скорость вывода текста в различных языках нежели что-то еще :). Это конечно тоже показатель, но достаточно странный, особенно если вы хотели проверить скорость выражений а не скорость того или иного I/O :)

     
     
  • 3.24, cmp (ok), 21:57, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Да мне без разницы как функция принт парсит аргумент, результат работы выражения, тоже не цель работы программы, по факту замера скорости получен результат, на основе которого я сделал вывод.

    Мне очень нравится JavaScript, он в максимальной степени предоставляет свободу действий, которую я могу сравнить только с С, в купе с легковесностью. - С радостью заменил бы им и
    стандартные инициализационные системные скрипты и php под httpd, но с такой производительностью это не имеет смысла.

    ngs/js показал себя с лучшей стороны, размер исполняемого файла - 300кб, по-этому на нагруженной машине инициализация программы почти не заметна, (по сравнению с тем же php, где размер "ехешника" 10М). Единственная проблема, в том, что проект уже года 3 не развивается, зато эти монстоподобные аналоги питонов плодятся как на дрожжах.

     
  • 2.22, cmp (ok), 21:14, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    >Файл test-r.sh

    #!/bin/bash

    function zzz() {
      setsid ./killcat 2 > /dev/null 2>&1 &
      cat > /dev/null 2>&1
      cat | grep -m 1 -E '[0-9]....*[0-9]'
    }

    t1='node test.js'
    t2='php -f test.php'
    t3='./test.sh'
    t4='js ./test2.js'
    t5='./test.bin'

    for x in 0 1 2 3 4 5 6 7 8 9; do
      $t1 2>/dev/null | zzz 2>/dev/null
    done


    >файл test.js

    for(var i = 0;; i++)
      console.log(i);

    >файл test.php

    <?php
    for($i = 0;; $i++)
      echo $i."\n";
    ?>

    >файл test.sh

    #!/bin/bash

    i=0
    while true; do
      echo $i
      i=$((i+1))
    done

    >файл test2.js

    for(var i = 0;; i++)
      print(i);

    >файл test.c, для gcc -O2 test.c -o test.bin

    #include <stdio.h>

    int main(void)
    {
      unsigned long long i = 0;
      while(1)
        printf("%lld\n", i);
      return 0;
    }


    >файл killcat

    #!/bin/bash

    sleep $1
    killall cat

    > ========================================
    > Сравнивая производителность принтов в различных языках вы не сравниваете языки. Вы сравниваете только принты.

    1) Принт часть языка, значит сравнивается, как Вы правильно заметили, не весь язык, но часть очень часто используемая, и если ее производительность хромает, то это !повод думать, что и другие части не идеальны.

    2) Проведите свой тест, более "чистый", уверен, что результат будет аналогичным, потому что разница НЕ в процентах а в порядках.

     
     
  • 3.25, _Vitaly_ (ok), 02:27, 17/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Даже с учетом тестирования вывода, тест совсем косячный.

    Замените для начала console.log() на util.puts()

     
     
  • 4.26, cmp (ok), 07:39, 17/02/2011 [^] [^^] [^^^] [ответить]  
  • +/

    ReferenceError: util is not defined

    На роль бета-тестера не претендую, однако для самых лютых 'анонимусов', для

    for(y=0;y<100;y++)
    for(x=0;x<300;x++)
      ;

    time node test.js -- real 0m0.106s
    time js test.js -- real 0m0.012s
    time php -f test.php -- real 0m0.270s

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

     
     
  • 5.27, _Vitaly_ (ok), 08:15, 17/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    util через require подключить надо, функция там. Посмотрите по документации. Либо код напрямую стырить:

    process.stdout.write(...)

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

     
  • 2.32, nuclight (ok), 16:37, 21/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > js     1.091.000 (http://www.ngs.fi/js/)

    404 :(

     

  • 1.10, Аноним (-), 11:03, 16/02/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    @автор_новости: udns уже давно заменили на c-ares
     
  • 1.15, Cyber (??), 15:19, 16/02/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    джава скрипт как аналог php - извращенцы...
     
     
  • 2.16, terr0rist (??), 15:38, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    извращенство - это ПХП.
     

  • 1.17, Аноним123321 (ok), 15:54, 16/02/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > ...передают результат своей работы обратно через неименованный канал (pipe).

    даже на венде? :-)

    так и представил: \\.\pipe\tA8hZcYw... :-)

     
     
  • 2.18, Аноним (-), 17:51, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    >> ...передают результат своей работы обратно через неименованный канал (pipe).
    > даже на венде? :-)
    > так и представил: \\.\pipe\tA8hZcYw... :-)

    речь про _неименованный_ канал

     
     
  • 3.19, Аноним12233 (ok), 18:50, 16/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    ...приоткрою завесу "великой" тайны -- неименовынные каналы -- в кривопридуманной венде это именовынные каналы но со случайным именем :-)

    а иначе небыло бы такого "удовольствия" писать под венду программульки.. еслибы не её извращённое API :-) :-D

     
     
  • 4.29, nagual (ok), 16:38, 18/02/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > ...приоткрою завесу "великой" тайны -- неименовынные каналы -- в кривопридуманной венде
    > это именовынные каналы но со случайным именем :-)
    > а иначе небыло бы такого "удовольствия" писать под венду программульки.. еслибы не
    > её извращённое API :-) :-D

    Небудет оно под венду работать так же хорошо как под никс ...

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру