Александр Михайлов СПбАУ , 2011
• Server-side Javascrpit
• Событийно-ориентированный
• Front-end – Javascript
• Back-end – C++
• Основан на Google’s V8
• Автор – Ryan Lienhart Dahl
Введение
2
Эра LAMP
• 2000–2009 годы
• Сервер – это база данных
• Сервер заполняет шаблоны данными из
БД и отправляет клиенту
4
L – Linux
A – Apache
M – MySQL
P – PHP
Apache vs NGINX
7
http://blog.webfaction.com/a-little-holiday-present
Apache vs NGINX
8
http://blog.webfaction.com/a-little-holiday-present
• Переключение контекста – не
бесплатно
• Затраты памяти на стек
Проблемы
9
For massive concurrency, cannot
use an OS thread for each
connection. [1]
• В основе node – функции обратного вызова (callback functions)
• Пользовательский код выполняется в одном потоке.
• To receive info from disk, network, or another process there must be a Callback. [1]
Как это работает
11
var sys = require("sys");
setTimeout(function () {
sys.puts("world");
}, 2000);
sys.puts("hello");
Event Loop
12
• Инициализация
• Обработка и «выполнение» кода
• Не I/O код немедленно выполняется
• I/O код добавляется в event loop
• Достигнут конец кода
• Event loop начинает выполнение
Event Loop
13
• Задачи выполняются, используя неблокирующие объекты ядра: epoll, kqueue, /dev/poll, select etc
• Event loop засыпает…
• Когда задача завершается – ядро оповещает Event loop
• Event loop вызывает и удаляет из очереди callback
• Программа завершается, когда Event loop пуст
Последовательное выполнение
14
console.log("begin");
setTimeout(function () {
console.log("2000ms timeout");
setTimeout(function () {
console.log("1500ms timeout");
setTimeout(function () {
console.log("1000ms timeout");
setTimeout(function () {
console.log("final");
}, 500);
}, 1000);
}, 1500);
}, 2000);
console.log("end");
Последовательное выполнение
16
var Sync = require('sync');
console.log("begin");
Sync(function(){
Sync.sleep(2000);
console.log('2000ms timeout');
Sync.sleep(1500);
console.log("1500ms timeout");
Sync.sleep(1000);
console.log("1000ms timeout");
Sync.sleep(500);
console.log("final");
});
Одновременное выполнение
17
console.log("begin");
setTimeout(function () {
console.log("2000ms timeout");
}, 2000);
setTimeout(function () {
console.log("1500ms timeout");
}, 1500);
setTimeout(function () {
console.log("1000ms timeout");
}, 1000);
setTimeout(function () {
console.log("final");
}, 500);
console.log("end");
Одновременное выполнение
19
var counter = 3;
console.log("begin");
setTimeout(function () {
console.log("2000ms timeout");
if (-- counter == 0) final();
}, 2000);
setTimeout(function () {
console.log("1500ms timeout");
if (-- counter == 0) final();
}, 1500);
setTimeout(function () {
console.log("1000ms timeout");
if (-- counter == 0) final();
}, 1000);
function final() {
setTimeout(function () {
console.log("final");
}, 500);
}
console.log("end");
Ссылки
[0] http://nodejs.org/
[1] http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf
[2] Node.js 0.4.7 Reference (rus)
[3] http://habrahabr.ru/blogs/nodejs/116581/
[4] http://habrahabr.ru/blogs/nodejs/112977/
[5] Understanding node.js (rus)
21