Upload
alexey-simonenko
View
1.785
Download
12
Embed Size (px)
DESCRIPTION
Citation preview
http://serenity.su
Немного о себе:• Работаю в интернете более 12 лет• Сейчас директор по технологиям в Serenity• Активно эксперементирую с HTML5/JavaScript• simonenko.su• github.com/meritt
http://serenity.su
среда, 29 августа 12 г.
http://serenity.su
NODE.JS ЭТО ПЛАТФОРМА ДЛЯ СОЗДАНИЯ ЛЕГКО МАСШТАБИРУЕМЫХ СЕТЕВЫХ
ПРИЛОЖЕНИЙ
3среда, 29 августа 12 г.
http://serenity.su
•Работает везде: Windows, OS X, Linux
•Устанавливается как обычное приложение
•Для начала работы не нужен сервер
•Для работы подойдет любой текстовый редактор
•Достаточно знать 1 язык для сервера и клиента
НАЧАТЬ ЛЕГКО
http://nodejs.org/#download
среда, 29 августа 12 г.
http://serenity.su
ЧТО ТАКОЕ NODE.JS?
•Построен на JavaScript движке браузера Google Chrome V8
5среда, 29 августа 12 г.
http://serenity.su
ЧТО ТАКОЕ NODE.JS?
•Построен на JavaScript движке браузера Google Chrome V8
•Event-driven, non-blocking I/O, streams
5среда, 29 августа 12 г.
http://serenity.su
ЧТО ТАКОЕ NODE.JS?
•Построен на JavaScript движке браузера Google Chrome V8
•Event-driven, non-blocking I/O, streams
•Реализация самых важных протоколов (HTTP, DNS, TLS/SSL)
5среда, 29 августа 12 г.
http://serenity.su
ЧТО ТАКОЕ NODE.JS?
•Построен на JavaScript движке браузера Google Chrome V8
•Event-driven, non-blocking I/O, streams
•Реализация самых важных протоколов (HTTP, DNS, TLS/SSL)
•Node Package Manager (npm) — уже более 9000 модулей
5среда, 29 августа 12 г.
http://serenity.su
ПРИМЕР “HELLO WORLD”
var http = require('http');
var server = http.createServer(function(request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World');});
server.listen(3000);
console.log('Server running at http://127.0.0.1:3000');
среда, 29 августа 12 г.
http://serenity.su
$ node server.js Server running at http://127.0.0.1:3000
РЕЗУЛЬТАТ
7среда, 29 августа 12 г.
http://serenity.su
СРАВНИМ NODE.JS И PHP
•Для сравнения возьмем сайты digitalconf.ru и htmlacademy.ru
•Оба сайта расположены на одинаковом выделенном хостинге
•
•Для node.js используем: nginx, nodejs, express
•Для php используем: apache, php, zend framework
$ ab -c 10 -n 1000 http://digitalconf.ru/
8среда, 29 августа 12 г.
http://serenity.su
РЕЗУЛЬТАТЫ
digitalconf.ru
htmlacademy.ru
0 55 110 165 220
25
203
ab -c 10 -n 1000
Requests per second
9среда, 29 августа 12 г.
http://serenity.su
ПОЧЕМУ ТАК БЫСТРО!?
среда, 29 августа 12 г.
http://serenity.su
ОДНОПОТОЧНЫЙ СИНХРОННЫЙ I/O
среда, 29 августа 12 г.
http://serenity.su
МУЛЬТИПОТОЧНЫЙ СИНХРОННЫЙ I/O
среда, 29 августа 12 г.
http://serenity.su
МУЛЬТИПОТОЧНЫЙ СИНХРОННЫЙ I/O
среда, 29 августа 12 г.
http://serenity.su
Всегда можно купить еще несколько серверов, но это стоит денег.
среда, 29 августа 12 г.
http://serenity.su
ОДНОПОТОЧНЫЙ АСИНХРОННЫЙ I/O
среда, 29 августа 12 г.
http://serenity.su
ПРОБЛЕМА NODE.JSВ CPU ВЫЧИСЛЕНИЯХ
среда, 29 августа 12 г.
http://serenity.su
COMMONJS И СИСТЕМА МОДУЛЕЙ
среда, 29 августа 12 г.
http://serenity.su
// hello.jsexports.world = function(text) { return 'Hello ' + text + '!';};
// server.jsvar http = require('http');var hello = require('./hello');
var server = http.createServer(function(request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(hello.world('ITMO'));});
server.listen(3000);
console.log('Server running at http://127.0.0.1:3000');
ПРИМЕР РАБОТЫ МОДУЛЕЙ
среда, 29 августа 12 г.
http://serenity.su
$ node server.js Server running at http://127.0.0.1:3000
РЕЗУЛЬТАТ
19среда, 29 августа 12 г.
http://serenity.su
NPMNODE PACKAGE MANAGER
среда, 29 августа 12 г.
http://serenity.su
МОДУЛИ О КОТОРЫХ СТОИТ ЗНАТЬ
•express — sinatra inspired web development framework
•mustache — logic-less {{mustache}} templates with JavaScript
•socket.io — real-time apps made cross-browser & easy with a WebSocket-like API
•request — simplified HTTP request client
•async — higher-order functions and common patterns for asynchronous code
среда, 29 августа 12 г.
http://serenity.su
КАК УСТАНОВИТЬ?
$ npm install [email protected] ./node_modules/express!"" [email protected]!"" [email protected]!"" [email protected]#"" [email protected] ([email protected])
среда, 29 августа 12 г.
http://serenity.su
ПРИМЕР “HELLO WORLD” НА EXPRESS
var express = require('express');
var server = express.createServer();
server.get('/', function(request, response) { response.send('Hello Express World');});
server.listen(3000);console.log('Server running at http://127.0.0.1:3000');
среда, 29 августа 12 г.
http://serenity.su
$ node server.js Server running at http://127.0.0.1:3000
РЕЗУЛЬТАТ
24среда, 29 августа 12 г.
http://serenity.su
ПОПРОБУЕМ УСЛОЖНИТЬ
среда, 29 августа 12 г.
http://serenity.su
ПРИМЕР РАБОТЫ С ПАРАМЕТРАМИ
var express = require('express');var server = express.createServer();
server.get('/', function(request, response) { response.redirect('/alexey');});
server.get('/:name', function(request, response) { response.send('Hello ' + request.params.name + '!');});
server.listen(3000);console.log('Server running at http://127.0.0.1:3000');
среда, 29 августа 12 г.
http://serenity.su
$ node server.js Server running at http://127.0.0.1:3000
РЕЗУЛЬТАТ
27среда, 29 августа 12 г.
http://serenity.su
СОХРАНЕНИЕ ОКРУЖЕНИЯ
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100);}
среда, 29 августа 12 г.
http://serenity.su
СОХРАНЕНИЕ ОКРУЖЕНИЯ
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100);}
$ node example.js turtles: 17turtles: 17turtles: 17turtles: 17
среда, 29 августа 12 г.
http://serenity.su
СОХРАНЕНИЕ ОКРУЖЕНИЯ
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100);}
$ node example.js turtles: 17turtles: 17turtles: 17turtles: 17
bad way
среда, 29 августа 12 г.
http://serenity.su
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) { (function(animal) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100); })(animal);}
СОХРАНЕНИЕ ОКРУЖЕНИЯ
среда, 29 августа 12 г.
http://serenity.su
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) { (function(animal) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100); })(animal);}
СОХРАНЕНИЕ ОКРУЖЕНИЯ
$ node example.js cats: 10dogs: 1frogs: 6turtles: 17
среда, 29 августа 12 г.
http://serenity.su
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) { (function(animal) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100); })(animal);}
СОХРАНЕНИЕ ОКРУЖЕНИЯ
$ node example.js cats: 10dogs: 1frogs: 6turtles: 17
good way
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');
function content() { var results = []; var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';
fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file'); }); }
return results;}
var results = content();console.log(results);
БЛОКИРОВКИ
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');
function content() { var results = []; var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';
fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file'); }); }
return results;}
var results = content();console.log(results);
БЛОКИРОВКИ
$ node example.js []
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');
function content() { var results = []; var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';
fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file'); }); }
return results;}
var results = content();console.log(results);
БЛОКИРОВКИ
$ node example.js []
bad way
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');
function content(callback) { var results = []; var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';
(function(file) { fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file');
if (results.length == files.length) callback(results); }); })(file); }}
content(function(results) { console.log(results);});
БЛОКИРОВКИ
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');
function content(callback) { var results = []; var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';
(function(file) { fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file');
if (results.length == files.length) callback(results); }); })(file); }}
content(function(results) { console.log(results);});
БЛОКИРОВКИ
$ node example.js [ 'data for 2.txt', 'data for 4.txt', 'data for 1.txt', 'data for 5.txt', 'data for 3.txt' ]
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');
function content(callback) { var results = []; var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';
(function(file) { fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file');
if (results.length == files.length) callback(results); }); })(file); }}
content(function(results) { console.log(results);});
БЛОКИРОВКИ
$ node example.js [ 'data for 2.txt', 'data for 4.txt', 'data for 1.txt', 'data for 5.txt', 'data for 3.txt' ]
good way
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');var results = ['start'];
fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt');
fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt');
fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt');
console.log(results); }); });});
СПАГЕТТИ-КОД
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');var results = ['start'];
fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt');
fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt');
fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt');
console.log(results); }); });});
СПАГЕТТИ-КОД
$ node example.js [ 'start', 'data for alpha.txt', 'data for beta.txt', 'data for gamma.txt' ]
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');var results = ['start'];
fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt');
fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt');
fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt');
console.log(results); }); });});
СПАГЕТТИ-КОД
$ node example.js [ 'start', 'data for alpha.txt', 'data for beta.txt', 'data for gamma.txt' ]
bad way
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');
function alpha(results, callback) { fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt'); beta(results, callback); });}
function beta(results, callback) { fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt'); gamma(results, callback); });}
function gamma(results, callback) { fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt'); callback(results); });}
alpha(['start'], function(results) { console.log(results);});
СПАГЕТТИ-КОД
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');
function alpha(results, callback) { fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt'); beta(results, callback); });}
function beta(results, callback) { fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt'); gamma(results, callback); });}
function gamma(results, callback) { fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt'); callback(results); });}
alpha(['start'], function(results) { console.log(results);});
СПАГЕТТИ-КОД
$ node example.js [ 'start', 'data for alpha.txt', 'data for beta.txt', 'data for gamma.txt' ]
среда, 29 августа 12 г.
http://serenity.su
var fs = require('fs');
function alpha(results, callback) { fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt'); beta(results, callback); });}
function beta(results, callback) { fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt'); gamma(results, callback); });}
function gamma(results, callback) { fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt'); callback(results); });}
alpha(['start'], function(results) { console.log(results);});
СПАГЕТТИ-КОД
$ node example.js [ 'start', 'data for alpha.txt', 'data for beta.txt', 'data for gamma.txt' ]
good way
среда, 29 августа 12 г.
http://serenity.su
ОРГАНИЗУЕМ TWITTER КОНФЕРЕНЦИЮ?
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
http://serenity.su
ЗАДАЧИ
•Получать сообщения из twitter как только они написаны
•Отображать сообщения из twitter в браузере моментально
•Работать без перезагрузки
•Держать большие нагрузки
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
http://serenity.su
ЧТО ИСПОЛЬЗОВАТЬ?
WebSockets (HTML5)с помощью socket.io
Twitter Streaming APIс помощью http streaming
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
http://serenity.su
СХЕМА РАБОТЫ
Node.JS Twitter
WebSockets Streaming API
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
http://serenity.su
ПОЛУЧАЕМ СООБЩЕНИЯ ИЗ TWITTERvar https = require('https');var message = '';var options = { host: 'stream.twitter.com', path: '/1/statuses/filter.json?track=iphone'};
https.get(options, function(response) { response.setEncoding('utf8'); response.on('data', function(chunk) { message += chunk; newline = message.indexOf("\r");
if (newline !== -1) { tweet = message.slice(0, newline); } message = message.slice(newline + 1); });});
среда, 29 августа 12 г.
http://serenity.su
ОТПРАВЛЯЕМ СООБЩЕНИЯ ЧЕРЕЗ WEBSOCKETS
...
https.get(options, function(response) { ...
tweet = message.slice(0, newline);
clients.forEach(function(client) { client.send(tweet); });
...});
...
var clients = [];
var io = require('socket.io').listen(8080);
io.sockets.on('connection', function(socket) { clients.push(socket);});
...
среда, 29 августа 12 г.
http://serenity.su
ДЕМО
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
http://serenity.suhttp://serenity.su
Спасибо!Алексей Симоненкодиректор по технологиям
http://simonenko.su
среда, 29 августа 12 г.
КОНТАКТЫна http://serenity.su
СЛЕДИТЕ ЗА НАМИ
vk.com/serenity_su twitter.com/serenity_su facebook.com/serenity.su
среда, 29 августа 12 г.