Представлен третий стабильный релиз платформы node.js 0.6 (нечетные ветки - экспериментальные, а четные (0.2, 0.4, 0.6) - стабильные), предназначенной для обособленного выполнения высокопроизводительных сетевых приложений на языке JavaScript. Функции платформы не ограничены созданием серверных скриптов для Web, платформа может использоваться и для создания обычных сетевых клиентских и серверных программ. Для обеспечения выполнения JavaScript-кода используется разработанный компанией Google движок V8.
Для обеспечения обработки большого числа параллельных запросов node.js задействует асинхронную модель запуска кода, основанную на обработке событий в неблокирующем режиме и определении callback-обработчиков. В качестве способов мультиплексирования соединений поддерживается epoll, kqueue, /dev/poll и select. Для мультиплексирования соединений используется библиотека libev, для создания пула потоков (thread pool) задействована библиотека libeio, для выполнения DNS-запросов в неблокирующем режиме интегрирован c-ares. Все системные вызовы, вызывающие блокирование, выполняются внутри пула потоков и затем, как и обработчики сигналов, передают результат своей работы обратно через неименованный канал (pipe).
По своей сути node.js похож на фреймворки Ruby Event Machine и Python Twisted, но цикл обработки событий (event loop) в node.js скрыт от разработчика и напоминает обработку событий работающим в браузере web-приложением. При написании приложений для node.js необходимо учитывать специфику событийно-ориентированного программирования, например, вместо выполнения "var result = db.query("select..");" с ожиданием завершения работы и последующей обработкой результатов, в node.js использует принцип асинхронного выполнения, т.е. код трансформируется в "db.query("select..", function (result) {обработка результата});", при котором управление мгновенно перейдет к дальнейшему коду, а результат запроса будет обработан по мере поступления данных. Ни одна функция в node.js не должна напрямую выполнять операции ввода/вывода - для получения данных с диска, от другого процесса или из сети требуется установка callback-обработчика.
Для расширения функциональности приложений на базе node.js подготовлена большая коллекция модулей, в которой можно найти модули с реализацией HTTP/SMTP/XMPP/DNS/FTP/IMAP/POP3 серверов и клиентов, модули для интеграции с различными web-фреймворков, WebSocket и Ajax обработчики, коннекторы к СУБД (MySQL, PostgreSQL, SQLite, MongoDB), шаблонизаторы, CSS-движки, реализации криптоалгоритмов и систем авторизации (например, OAuth), XML-парсеры.
Ключевые новшества node.js 0.6:
- Поддержка платформы Windows с задействованием API I/O Completion Ports для обеспечения высокопроизводительной асинхронной обработки большого числа одновременных сетевых соединений. Ранее доступный порт, работающий через систему Cygwin больше не поддерживается. Портирование для Windows было не простой задачей и потребовало переработки большой части архитектуры ядра node.js, что положительно сказалось на производительности, в том числе и при работе на Unix-системах;
- По сравнению с версией 0.4.12 в 0.6.0 увеличилась производительность операций чтения (io.js read), уменьшилось время запуска и возросла скорость выполнения некоторых других операций. Например, на платформе Linux тестовый скрипт http_simple.js способен выполнить 6263 запросов в секунду (в прошлой версии 5461 запросов в секунду). Пропускная способность операции io.js read возросла с 19.75 mB/s до 26.63 mB/s, а скоросоть запуска startup.js уменьшилась с 74.7 ms до 49.6 ms. Пропускная способность операций записи (io.js write) немного уменьшилась - с 21.60 mB/s до 17.40 mB/s;
- Интегрированы средства балансировки нагрузки с её распределением на несколько процессов. Для более полного задействования возможностей многоядерных CPU поддерживается запуск кластера из отдельных процессов node.js;
- Улучшена поддержка IPC-вызовов между несколькими экземплярами node.js, созданными при выполнении вызова fork;
- Расширены возможности работающего в режиме командной строки клиента для работы со встроенным в V8 отладчиком;
- Встроен биндинг для обеспечения сжатия с использованием библиотеки zlib;
- Незначительное изменение API. Например, удалены http.Agent.appendMessage(), http.getAgent(), net.Server.listenFD(), process.ENV, process.ARGV, process.binding('stdio') и т.д. Добавлены: child_process.fork(), crypto.createDiffieHellman(), crypto.pbkdf2(), crypto.randomBytes(), fs.utimes()/utimesSync(), fs.futimes()/futimesSync(), http.ClientRequest.setTimeout()/setNoDelay()/setSocketKeepAlive(), net.connect(), os.arch(), os.platform(), os.uptime(), os.networkInterfaces() и т.д.
- JavaScript-движок V8 обновлён с версии 3.1 до 3.6. Из наиболее заметный изменений: RegExp больше не является функцией, поэтому необходимо выполнять RegExp.exec(); строковые даты (например Date('2011-06-06 00:00:00')) теперь привязываются в GMT, а не к локальному часовому поясу (нужно указывать Date('2011-06-06 00:00:00 +09:00')).
В настоящее время ведётся работа по сокращению цикла подготовки релизов node.js. Следующий стабильный выпуск 0.8 запланирован на январь. В дальнейшем разработчики намерены синхронизировать процесс разработки с браузером Chrome и движком V8, перейдя к выпуску новых версий каждые 6 недель.