using node.js to build great streaming services - html5 dev conf

51
@sh1mmer Using Node.js to Build Great Streaming Services

Upload: tom-hughes-croucher

Post on 08-May-2015

21.012 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Using Node.js to Build Great

Streaming Services

Page 2: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

Tom Hughes-Croucher@sh1mmer

Page 3: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 4: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 5: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Scalable Server-Side Code with JavaScript

Tom Hughes-Croucher

NodeUp and Running

http://ofps.oreilly.com/titles/9781449398583/http://shop.oreilly.com/product/0636920015956.do

Page 6: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

A story

Page 7: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

factory

Page 8: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 9: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 10: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

var http = require('http');

var server = http.createServer();server.listen(8000);server.on('request', function(req,res) { var doodad = new Doodad(); res.writeHead(200,{'Content-Type':'text/doodad'}); res.end(doodad);});

Page 11: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Making Doodads

Page 12: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Screens AntennasKnobs

& buttons

Page 13: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 14: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 15: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 16: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 17: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 18: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

var http = require('http'), fs = require('fs');

var server = http.createServer();server.listen(8000);server.on('request', function(req,res) { var screen = fs.readFileSync('/factory1/screen'); var dial = fs.readFileSync('/factory2/dial'); var doodad = new Doodad(screen, dial); res.writeHead(200,{'Content-Type':'text/doodad'}); res.end(doodad);});

Page 19: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Improving the factory with streaming

Page 20: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 21: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 22: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 23: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

var http = require('http');

var server = http.createServer();server.listen(8000);server.on('request', function(req,res) { var parts = 0; http.get('factory1/screen/', function(res) { var screen = ""; res.on('data', function(d) { screen += d }); res.on('end', finish); parts++; }; http.get('factory2/dial', function(res) { var dial = "" res.on('data', function(d) { dial += d }); res.on('end', finish); parts++; } function finish() { if(parts == 2) { var doodad = new Doodad(screen, dial); res.writeHead(200,{'Content-Type':'text/doodad'}); res.end(doodad); } }});

Page 24: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Streams API

Page 25: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

• Readable

• 'data' event

• 'end' event

• pause()

• resume()

• destroy()

• pipe()

Streams

• Writable

• write()

• end()

• 'drain' event

• destroy()

• destroySoon()

Page 26: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

var stream = require('stream');

var s = new stream.Stream(); //I am an EventEmitters.readable = true; //now I implement read API

s.emit('data', "my data");

s.emit('end'); //I'm done sending data

Page 27: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

var stream = require('stream');

var s = new stream.Stream(); //I am an EventEmitters.writable = true; //now I implement write APIs.data = "";

s.write = function(d) { s.data += d;};

s.end = function() { if(s.data) { console.log(s.data) }};

s.destroy = function() { s.writable = false;}

Page 28: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

The too many parts problem and why

phone calls don't work

Page 29: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 30: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

Event Loop Fail

libuv

add-ons

libev iocp

v8

node.ccTCP Conn

TCP Conn

TCP Conn

nextTicknextTick

FS Read

FS Read

FS Read

Timeout

Timeout

Interval

Run stuff

Page 31: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

stream.pause()

Page 32: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

Event Loop Fail

libuv

add-ons

libev iocp

v8

node.ccTCP Conn

TCP Conn

TCP Conn

nextTicknextTick

FS Read

FS Read

FS Read

Timeout

Timeout

Interval

stream.pause()

Page 33: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Managing Backpressure

• Manage Buffer sizes

• Use pause() / resume() to control back pressure

• Assume that 'data' event may happen after pause

• Remember node buffer -> kernel buffer

Page 34: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

//manage Node's write Buffersif(socket.bufferSize > maxSafe) { writeStream.pause();}

//Manage RS read stream Buffersfs.createReadStream('./path/to/file', { flags: 'r', encoding: null, fd: null, mode: 0666, bufferSize: 64 * 1024});

Page 35: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

New API

Page 36: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

New Streams TBD• Writable streams

• Same

• Readable (https://github.com/isaacs/readable-stream)

• configurable stream buffer waterline

• 'readable' event

• read(len) -> returns data

• Pipe

• Subscribers must implement readable stream

• No more direct access with Pipe

Page 37: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Page 38: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Types of Streaming

Page 39: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Simplex

Page 40: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

var fs = require('fs');

var rs = fs.createReadStream('/my/file/path');rs.on('data', function(d) { console.log(d);});

Page 41: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Throughput

Page 42: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

var fs = require('fs');

var rs = fs.createReadStream('/my/file/path');rs.pipe(process.stdout);

Page 43: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Duplex

Page 44: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

var bot1 = new chatterBot();var bot2 = new chatterBot();

bot1.pipe(bot2).pipe(bot1);

Page 45: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Libraries

Page 46: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

JSONStream

Page 47: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

{"total_rows":129,"offset":0,"rows":[ { "id":"change1_0.6995461115147918" , "key":"change1_0.6995461115147918" , "value":{"rev":"1-e240bae28c7bb3667f02760f6398d508"} , "doc":{ "_id": "change1_0.6995461115147918" , "_rev": "1-e240bae28c7bb3667f02760f6398d508","hello":1} }, { "id":"change2_0.6995461115147918" , "key":"change2_0.6995461115147918" , "value":{"rev":"1-13677d36b98c0c075145bb8975105153"} , "doc":{ "_id":"change2_0.6995461115147918" , "_rev":"1-13677d36b98c0c075145bb8975105153" , "hello":2 } },]}

Page 48: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

var stream = JSONStream.parse(['rows', true, 'doc']) //rows, ANYTHING, doc

stream.on('data', function(data) { console.log('received:', data);});

stream.on('root', function(root, count) { if (!count) { console.log('no matches found:', root); }});

Page 49: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

node-libexpat

Page 50: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Application

Page 51: Using Node.js to  Build Great  Streaming Services - HTML5 Dev Conf

@sh1mmer

Questions?