foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/bertbelder_nodejs.pdf · node is needed...

32

Upload: others

Post on 17-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus
Page 2: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus
Page 3: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

about:node

"Evented I/O for V8 javascript"

Young, but:

• 5800 mailing list members

• 4000 NPM packages

• 7 core developers, 4 funded

• In production: LinkedIn, Facebook, Yahoo, Voxer, Uber, ...

Page 4: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Almost there

Page 5: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Node is needed

The web evolves

Real time web

Client side rendering

The server as a message bus

Page 6: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

I/O

Most programming languages wait for I/O to complete:

While waiting, your program is sleeping.

Usual solution: threads

data = readfile("foo.bar");

Page 7: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

But...

Threads are difficult

... unless you don't try to share data between threads.

Traditional web stacks: 1 thread per connection

Page 8: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Real time web

Connections live long

How many threads can your server handle?

Page 9: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Node's solution

Handle everything in the same thread

Page 10: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

V8 javascript

You already know javascript

You already know async

Javascript has no I/O library

$('button').click(function() { ... } );

Page 11: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Hej Verden

var http = require('http');

var n = 0;

var server = http.createServer(function(req, res) {

res.writeHead(200, {

'content-type': 'text/plain'

});

res.end('Hej Verden! ' + n++);

});

server.listen(80);

Page 12: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Single threaded

Does that matter?

for (i = 0; i < 1e9; i++) {}

Page 13: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Event loop vs threads

Threads:

Page 14: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Event loop vs threads

Threads:

Event loop:

Page 15: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Event loop vs threads

Threads:

Event loop:

Page 16: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Event loop vs threads

Threads:

Event loop:

Page 17: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Outside of the thread

Run some nodes on 1 machine.

Run many nodes on many machines.

Page 18: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Under the hood

V8 + libev + libeio + c­ares + openssl + http_parser + glue

It's all about neworking.

Files: thread pool

DNS: :­/

Page 19: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Under the hood (new)

V8 + libuv + openssl + http_parser + glue

Goal: good windows support

libuv: node in c (https://github.com/joyent/libuv)

Page 20: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Libraries

• NPM

• Socket.io

• Express

• Hook.io

Page 21: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Sticky node

https://github.com/piscisaureus/goto

Page 22: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

$ npm install socket.io express

[email protected] ./node_modules/express/node_modules/mkdirp

[email protected] ./node_modules/express/node_modules/mime

[email protected] ./node_modules/express/node_modules/qs

[email protected] ./node_modules/socket.io/node_modules/policyfile

[email protected] ./node_modules/socket.io/node_modules/redis

[email protected] ./node_modules/express/node_modules/connect/node_modules/mime

[email protected] ./node_modules/express/node_modules/connect/node_modules/qs

[email protected] ./node_modules/express/node_modules/connect

[email protected] ./node_modules/express

[email protected] ./node_modules/socket.io/node_modules/socket.io-

client/node_modules/xmlhttprequest

[email protected] ./node_modules/socket.io/node_modules/socket.io-

client/node_modules/websocket-client

[email protected] ./node_modules/socket.io/node_modules/socket.io-

client/node_modules/uglify-js

[email protected] ./node_modules/socket.io/node_modules/socket.io-client

[email protected] ./node_modules/socket.io

Page 23: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Server

var express = require('express');

var app = express.createServer();

app.use(app.router);

app.use(express.static(__dirname + '/static'));

app.get('/', function(req, res){

res.redirect('/index.html');

});

app.listen(process.env.C9_PORT || 80);

Page 24: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Client

var socket = io.connect(window.location.protocol + '//' +

window.location.host + '/');

function send(note) {

socket.emit('note', note, clientId);

}

socket.on('note', function(note, clientId_) {

if (clientId_ != clientId) {

update(note);

}

});

Page 25: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Server (2)

io.sockets.on('connection', function(client) {

client.on('note', function(note, clientId) {

io.sockets.emit('note', note, clientId);

if (note.message) {

notes[note.id] = note;

} else {

delete notes[note.id];

}

});

});

Page 26: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Server (2)

io.sockets.on('connection', function(client) {

client.emit('init', notes);

client.on('note', function(note, clientId) {

io.sockets.emit('note', note, clientId);

if (note.message) {

notes[note.id] = note;

} else {

delete notes[note.id];

}

});

});

Page 27: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Client (2)

var socket = io.connect(window.location.protocol + '//' +

window.location.host + '/');

function send(note) {

socket.emit('note', note, clientId);

}

socket.on('init', function(notes) {

for (var k in notes) {

if (notes.hasOwnProperty(k)) {

update(notes[k]);

}

}

});

Page 28: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

SSID: node

Password: nodenode

http://192.168.173.1

Page 29: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Node 0.6

Node uses the linux versioning model. Even: (0.4.x) are stable, odd

(0.5.x): unstable

• Real Windows support

• gzip

• Better fault isolation

• Better file watchers

Page 30: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Post­0.6

• IPC

• Managing multiple nodes

Page 31: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Get started

• nodejs.org

• NPM (npmjs.org)

• Socket.io

• Express

Page 32: Foto op volledige paginajaoo.dk/dl/goto-aarhus-2011/slides/BertBelder_NodeJs.pdf · Node is needed The web evolves Real time web Client side rendering The server as a message bus

Questions?