21
Node.js Асинхронный веб сервер с неблокирующим I/O

Node.js (RichClient)

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Node.js (RichClient)

Node.jsАсинхронный веб сервер с неблокирующим I/O

Page 2: Node.js (RichClient)

Что такое Node.js

1) V8 - компилируемый JavaScript движок от Google

2) Event-loop c неблокирующим вводом/выводом

3) Модульная система CommonJS

Page 3: Node.js (RichClient)

Философия

Основная философия Node.js - асинхронное выполнение.

Скрипты в Node не дожидаются завершения длительных операций, они оставляют callback, который будет выполнен позже. При этом возврат в цикл обработки событий происходит как можно скорее. 

Page 4: Node.js (RichClient)

Блокировка программы при обращении к диску / сети

RAM: ~80 наносекундHDD: ~130 000 наносекундСеть: ~500 000 наносекунд

Это время можно было бы использовать с большей эффективностью

Page 5: Node.js (RichClient)

Асинхронный Ввод/Вывод (nonblocking I/O)

1) Как мы привыкли писать код на сервере:

$result = $db->query(' ... '); // Запрос

или, как бы  это выглядело на JS:

var result = db.query(' ... '); // Запрос

- Что происходит пока выполняется запрос к БД?

Приложение простаивает -

Page 6: Node.js (RichClient)

Асинхронный Ввод/Вывод (nonblocking I/O)

2) Как мы пишем асинхронный код:

db.query(' ... ', function(result) {  // Запрос    // Обработчик});

- Что происходит пока выполняется запрос к БД?

Приложение обслуживает следующего пользователя -

Page 7: Node.js (RichClient)

Современные вэб сервера используют многопоточность,

Но разве это лучший подход? Давайте сравним Apache и Nginx

Page 8: Node.js (RichClient)

Apache использует многопоточность,Проблема в том, что при увеличении числа

пользователей, потоков становится слишком много.

Page 9: Node.js (RichClient)

Переключение между потоками - ресурсоёмкая операция.

Каждый поток потребляет оперативную память.

Node.js также как и Nginx использует event-loop c неблокирующим вводом выводом.

Пользователи обслуживаются по очереди в порядке поступления, однако, например если пользователю нужно обратиться к диску, то пока производится чтение с диска, обслуживается следующий пользователь.

Event-loop

Page 10: Node.js (RichClient)

Event-loop

Таким образом приложение не простаивает, и обслуживает пользователей максимально эффективно!

Page 11: Node.js (RichClient)

Почему JavaScript?

Node.js - не первый проект призванный облегчить написание неболкирующих приложений,

для Python есть Twisted и Tornado,

для Ruby есть EventMachine

Но событийно управляемый ввод/вывод является достаточно фундаментальным сдвигом, который требует глубокой интеграции с языком программирования. 

Javascript - событийно-управляемый язык, так как своими корнями уходит в браузер.

Page 12: Node.js (RichClient)

Почему JavaScript?

Кроме того, JavaScript очень гибкий язык,пример сервера с помощью (fab)

Page 13: Node.js (RichClient)

Система событий

Стандартные библиотеки принимают callback в качестве параметра, и передают ему два аргумента, error и data.

Это простая и прозрачная структура, однако она может быть изменена сторонними библиотеками.

Page 14: Node.js (RichClient)

Система событий

Так-же вы можете использовать Promises:

var file = fs.open('file'); file.addCallback(function(data){ // Сделать что нибудь с данными });   file.addErrback('error', function(error){ // Если пришла ошибка, тоже что нибудь сделать });

Просто подключив модуль node_promise

Page 15: Node.js (RichClient)

Система модулей

1) Система модулей создана по стандарту CommonJS    (Многие CommonJS модули можно использовать в Node)

2) Кеширование модулей    (один и тот же код дважды не компилируется)

3) Модули не привязаны к языку на котором они написаны    (Модуль написанный на С/С++ подключается так-же как и JS модуль)

Page 16: Node.js (RichClient)

Внутренние модулиПример подключения: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

Page 17: Node.js (RichClient)

Внешние модулиПример подключения:var module_name = require('./module_name');//Указан абсолютный или относительный путь к модулю

Физически модуль может находиться по одному из следующих адресов:././module_name

Page 18: Node.js (RichClient)

Модули на С++

Компилируются в бинарный файл с расширением .node, и подключаются как обычные внутренние или внешние модули.

Так как из С++ API V8 доступны практически все возможности JavaScript почти любой модуль модет быть в последствии переписан на С++

Это  позволяет сначала писать весь проект на JavaScript, a потом при необходимости переписывать узкие места на С++.

Page 19: Node.js (RichClient)

Пример успешного использования Node.JS

Plurk:более 200 000 одновременных соединений1 сервер8 экземпляров Node32 гб памяти

Page 20: Node.js (RichClient)

Системы пакетов:Не смотря на молодость проекта, для него уже есть более 150 разных модулей(список: http://wiki.github.com/ry/node/modules)

Поэтому появилось несколько менеджеров пакетов, позволяющих не заботиться о связях и обновлении установленных модулей, самые популярные из них: - kiwi - seed - npm - mode

Page 21: Node.js (RichClient)

“two languages will never go away, C and JavaScript.” - Ryan Dahl

(создатель nodeJS)

Спасибо за внимание!