Slide 1

Slide 1 text

Async sfi 2013 krakow Mariusz gil

Slide 2

Slide 2 text

about me

Slide 3

Slide 3 text

about the problem

Slide 4

Slide 4 text

? user browser application click request response ajax

Slide 5

Slide 5 text

database server database server 200 m 200 m 400 m browser application request response ajax

Slide 6

Slide 6 text

i/o ops are expensive l1-cache 3 cycles l2-cache 14 cycles ram memory 250 cycles disk 41 000 000 cycles network 240 000 000 cycles Source: Ryan Dahl’s 2008.11.08 node.js presentation

Slide 7

Slide 7 text

about the solution ...one of them

Slide 8

Slide 8 text

event-driven non-blocking I/O server-side javaScript environment based on V8

Slide 9

Slide 9 text

event driven

Slide 10

Slide 10 text

event driven

Slide 11

Slide 11 text

event driven

Slide 12

Slide 12 text

? ? ? ? ? ? ? ? ?? ? ? what the...? ?

Slide 13

Slide 13 text

event machine twisted

Slide 14

Slide 14 text

single thread events queue event loop callbacks

Slide 15

Slide 15 text

request routing output formatting database query api call caching logging data processing

Slide 16

Slide 16 text

https://npmjs.org/ node packaged modules 25 178 packages underscore async request coffee-script express socket.io 1.4m downloads per day

Slide 17

Slide 17 text

apt-get install python g++ make mkdir ~/nodejs && cd $_ wget -N http://nodejs.org/dist/node-latest.tar.gz tar xzvf node-latest.tar.gz && cd `ls -rd node-v*` ./configure make install sudo apt-get install python-software-properties python g++ make sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs npm

Slide 18

Slide 18 text

var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');

Slide 19

Slide 19 text

var net = require('net'); var server = net.createServer(function (socket) { socket.write('Echo server\r\n'); socket.pipe(socket); }); server.listen(1337, '127.0.0.1');

Slide 20

Slide 20 text

var fs = require('fs'); var data = fs.readFileSync('sample.txt'); console.log(data); var fs = require('fs'); fs.readFile('sample.txt', function(err, data) { console.log(data); });

Slide 21

Slide 21 text

var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length(); if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function (worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); }); } else { // Workers can share any TCP connection // In this case its a HTTP server http.createServer(function(req, res) { res.writeHead(200,{'Content-Type': 'text/plain'}); res.end(”hello world\n”); }).listen(8000); }

Slide 22

Slide 22 text

var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : '', socketPath : '/opt/local/var/run/mysql55/mysqld.sock' }); connection.connect(); var query = connection.query('SELECT * FROM sakila.actor'); query .on('result', function(row) { connection.pause(); function processRow(row, callback) { console.log(row); callback(); } processRow(row, function() { connection.resume(); }); }) .on('end', function() { console.log('end\n'); });

Slide 23

Slide 23 text

var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('textEvent', function(data) { console.log(data); }); emitter.on('dataEvent', function(data) { console.log(data); }); emitter.emit('textEvent', 'Start'); emitter.emit('dataEvent', new Array(1, 2, 3, 4, 5)); emitter.emit('textEvent', 'End');

Slide 24

Slide 24 text

lightweight web framework like sinatra or silex express

Slide 25

Slide 25 text

realtime communication library socket.io

Slide 26

Slide 26 text

best use cases single page a lication lightweight API ma co ection serve non-blocking I/O a long p l

Slide 27

Slide 27 text

from rails to node mobile backends

Slide 28

Slide 28 text

problems... callbacks hell libraries deployment garbage collector current version is 0.10.0

Slide 29

Slide 29 text

callback hell http://callbackhell.com/ fs.readdir(source, function(err, files) { if (err) { console.log('Error finding files: ' + err) } else { files.forEach(function(filename, fileIndex) { console.log(filename) gm(source + filename).size(function(err, values) { if (err) { console.log('Error identifying file size: ' + err) } else { console.log(filename + ' : ' + values) aspect = (values.width / values.height) widths.forEach(function(width, widthIndex) { height = Math.round(width / aspect) console.log('resizing ' + filename + 'to ' + height + 'x' + height) this.resize(width, height).write(destination + 'w' + width + '_' + filename, function(err) { if (err) console.log('Error writing file: ' + err) }) }.bind(this)) } }) }) } })

Slide 30

Slide 30 text

var async = require('async'); async.parallel([ function(callback) { ... }, function(callback) { ... } ], callback); var async = require('async'); async.waterfall([ function(callback) { ... }, function(arg, callback) { ... } ], callback);

Slide 31

Slide 31 text

thanks! feel free to contact with me email: [email protected] twitter: @mariuszgil