Slide 1

Slide 1 text

JavaScript Streams Presentación para JS Peru 10 Dic 2012 Monday, 10 December 12

Slide 2

Slide 2 text

$ whoami • @lupomontero • http://lupomontero.com • ENOISE Lupo Montero Monday, 10 December 12

Slide 3

Slide 3 text

Un problema: I/O Monday, 10 December 12

Slide 4

Slide 4 text

nginx vs apache Event loop vs Threads Peticiones/seg y conexiones simultáneas http://blog.webfaction.com/2008/12/a-little-holiday-present-10000-reqssec-with-nginx-2/ Monday, 10 December 12

Slide 5

Slide 5 text

nginx vs apache Event loop vs Threads Memoria y conexiones simultáneas http://blog.webfaction.com/2008/12/a-little-holiday-present-10000-reqssec-with-nginx-2/ Monday, 10 December 12

Slide 6

Slide 6 text

Por qué JavaScript • Porque es el lenguage del browser (single thread event loop) • Porque resulta no ser lo que creíamos que era • Porque tiene muy buenas partes (funciones, closures, lexical scoping, ...) • Porque se adapta con naturalidad a un paradigma asíncrono basado en eventos Monday, 10 December 12

Slide 7

Slide 7 text

node.js in brief The first presentation on Node.js from Ryan Dahl at JSConf 2009 http://www.youtube.com/watch?v=ztspvPYybIY • Server-side JavaScript • Built on Google’s V8 • Evented, non-blocking, I/O. Similar to EventMachine or Twisted • CommonJS modules system • 8000 lines of C/C++, 2000 lines of JavaScript, 14 contributors Monday, 10 December 12

Slide 8

Slide 8 text

Funciones en JavaScript // Una función con nombre function foo(a) { var b = 1; return a + b; } // Una referencia a una función anónima var foo = function (a) { var b = 1; return a + b; }; // Invocamos una función pasando otra función anónima // como argumento (callback) $.get('/someurl', function (err, res) { if (err) { return console.error(err); } // Hacemos algo con `res`... }); Monday, 10 December 12

Slide 9

Slide 9 text

var results = db.query('SELECT * FROM ...'); // Hacemos algo con `results`. Tres paradigmas Bloqueando I/O Monday, 10 December 12

Slide 10

Slide 10 text

db.query('SELECT * FROM ...', function (err, results) { if (err) { // Hubo un error! } // ... }); Tres paradigmas Callback Monday, 10 December 12

Slide 11

Slide 11 text

db.query('SELECT * FROM ...') .on('error', function (err) { // Houston, tenemos un problema... }) .on('result', function (row) { // ... }) .on('end', function () { // Ya se han emitido todos los resultados. }); Tres paradigmas EventEmitter Monday, 10 December 12

Slide 12

Slide 12 text

Una “corriente” o “stream” Monday, 10 December 12

Slide 13

Slide 13 text

“Streams are to time as arrays are to space.” -- Jed Schmidt @ JSConf.eu Monday, 10 December 12

Slide 14

Slide 14 text

UNIX pipes Monday, 10 December 12

Slide 15

Slide 15 text

Una metáfora Monday, 10 December 12

Slide 16

Slide 16 text

Flujo de datos Monday, 10 December 12

Slide 17

Slide 17 text

Mezclador multicanal de streams de audio Monday, 10 December 12

Slide 18

Slide 18 text

UNIX pipes en el terminal $ ls | grep ‘^node’ shell ls grep shell stdin stdin stdout stdout Monday, 10 December 12

Slide 19

Slide 19 text

Streams a.pipe(b); // a | b a.pipe(b).pipe(c).pipe(d); // a | b | c | d http.createServer(function (req, res) { fs.createReadStream(__dirname + '/rows.json').pipe(res); }); a.pipe(b).pipe(a); Monday, 10 December 12

Slide 20

Slide 20 text

Tipos de Streams • Readable • Writable • Through / Filter • Duplex • ... Monday, 10 December 12

Slide 21

Slide 21 text

Backpressure: pause stream Monday, 10 December 12

Slide 22

Slide 22 text

Ejemplos y notas • https://github.com/lupomontero/jsperu-streams Monday, 10 December 12