node.js (richclient)
DESCRIPTION
TRANSCRIPT
Node.jsАсинхронный веб сервер с неблокирующим I/O
Что такое Node.js
1) V8 - компилируемый JavaScript движок от Google
2) Event-loop c неблокирующим вводом/выводом
3) Модульная система CommonJS
Философия
Основная философия Node.js - асинхронное выполнение.
Скрипты в Node не дожидаются завершения длительных операций, они оставляют callback, который будет выполнен позже. При этом возврат в цикл обработки событий происходит как можно скорее.
Блокировка программы при обращении к диску / сети
RAM: ~80 наносекундHDD: ~130 000 наносекундСеть: ~500 000 наносекунд
Это время можно было бы использовать с большей эффективностью
Асинхронный Ввод/Вывод (nonblocking I/O)
1) Как мы привыкли писать код на сервере:
$result = $db->query(' ... '); // Запрос
или, как бы это выглядело на JS:
var result = db.query(' ... '); // Запрос
- Что происходит пока выполняется запрос к БД?
Приложение простаивает -
Асинхронный Ввод/Вывод (nonblocking I/O)
2) Как мы пишем асинхронный код:
db.query(' ... ', function(result) { // Запрос // Обработчик});
- Что происходит пока выполняется запрос к БД?
Приложение обслуживает следующего пользователя -
Современные вэб сервера используют многопоточность,
Но разве это лучший подход? Давайте сравним Apache и Nginx
Apache использует многопоточность,Проблема в том, что при увеличении числа
пользователей, потоков становится слишком много.
Переключение между потоками - ресурсоёмкая операция.
Каждый поток потребляет оперативную память.
Node.js также как и Nginx использует event-loop c неблокирующим вводом выводом.
Пользователи обслуживаются по очереди в порядке поступления, однако, например если пользователю нужно обратиться к диску, то пока производится чтение с диска, обслуживается следующий пользователь.
Event-loop
Event-loop
Таким образом приложение не простаивает, и обслуживает пользователей максимально эффективно!
Почему JavaScript?
Node.js - не первый проект призванный облегчить написание неболкирующих приложений,
для Python есть Twisted и Tornado,
для Ruby есть EventMachine
Но событийно управляемый ввод/вывод является достаточно фундаментальным сдвигом, который требует глубокой интеграции с языком программирования.
Javascript - событийно-управляемый язык, так как своими корнями уходит в браузер.
Почему JavaScript?
Кроме того, JavaScript очень гибкий язык,пример сервера с помощью (fab)
Система событий
Стандартные библиотеки принимают callback в качестве параметра, и передают ему два аргумента, error и data.
Это простая и прозрачная структура, однако она может быть изменена сторонними библиотеками.
Система событий
Так-же вы можете использовать Promises:
var file = fs.open('file'); file.addCallback(function(data){ // Сделать что нибудь с данными }); file.addErrback('error', function(error){ // Если пришла ошибка, тоже что нибудь сделать });
Просто подключив модуль node_promise
Система модулей
1) Система модулей создана по стандарту CommonJS (Многие CommonJS модули можно использовать в Node)
2) Кеширование модулей (один и тот же код дважды не компилируется)
3) Модули не привязаны к языку на котором они написаны (Модуль написанный на С/С++ подключается так-же как и JS модуль)
Внутренние модулиПример подключения:var module_name = require('module_name');
Физически модуль может находиться по одному из следующих адресов:/home/user/.node_libraries//home/user/.node_libraries/module_name/usr/local/lib/node/libraries//usr/local/lib/node/libraries/module_name
Внешние модулиПример подключения:var module_name = require('./module_name');//Указан абсолютный или относительный путь к модулю
Физически модуль может находиться по одному из следующих адресов:././module_name
Модули на С++
Компилируются в бинарный файл с расширением .node, и подключаются как обычные внутренние или внешние модули.
Так как из С++ API V8 доступны практически все возможности JavaScript почти любой модуль модет быть в последствии переписан на С++
Это позволяет сначала писать весь проект на JavaScript, a потом при необходимости переписывать узкие места на С++.
Пример успешного использования Node.JS
Plurk:более 200 000 одновременных соединений1 сервер8 экземпляров Node32 гб памяти
Системы пакетов:Не смотря на молодость проекта, для него уже есть более 150 разных модулей(список: http://wiki.github.com/ry/node/modules)
Поэтому появилось несколько менеджеров пакетов, позволяющих не заботиться о связях и обновлении установленных модулей, самые популярные из них: - kiwi - seed - npm - mode
“two languages will never go away, C and JavaScript.” - Ryan Dahl
(создатель nodeJS)
Спасибо за внимание!