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