SlideShare une entreprise Scribd logo
1  sur  164
Benvenuti
Luciano Colosio
@unlucio
CTO @ SaveTheMom Inc.
Federico Gandellini
@gandellinux
Freelance Developer
INDEX
• Node.js: la storia
• Node.js distilled: SyncVS Async
• Clouding
• Uso di node come Backend API
Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network
applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and
efficient, perfect for data-intensive real-time applications that run across distributed devices.
CurrentVersion: v0.8.21
RYAN DAHL
node.js creator
anno: 2009
RYAN DAHL
Studente in Matematica
Si trasferisce in Sud America
Incontra un programmatore php
Inizia a sviluppare siti ed “applicazioni” web
Incontra ROR
Si accorge che il Web e’ lento!
Il Web e’ lento!
Per via di Java ;)
Il Web e’ lento!
Alcuni cominciano a lavorare per velocizzare ROR
Il Web e’ lento!
Alcuni cominciano a lavorare per velocizzare ROR
Ma il problema risiede nell’intero stack
Il Web e’ lento!
Alcuni cominciano a lavorare per velocizzare ROR
Ma il problema risiede nell’intero stack
Il lavoro di Zed Shaw da vita a Mongrel
Mongrel
Mongrel
E’ sia una libreria http, sia un webserver!
Mongrel
E’ sia una libreria http, sia un webserver!
Il web server non e’ piu’ solo “una directory “
Mongrel
E’ sia una libreria http, sia un webserver!
Il web server non e’ piu’ solo “una directory “
Puo’ racchiudere direttamente la logica
Il Web Server
Il Web Server
Distillato, e’ fatto per gestire richieste e risposte
Il Web Server
Distillato, e’ fatto per gestire richieste e risposte
Servire files e’ una parte ma non e’ obbligatoria
THE FILE UPLOAD PROBLEM
THE FILE UPLOAD PROBLEM
Caricare files via http non era poi cosi’ comune
THE FILE UPLOAD PROBLEM
Caricare files via http non era poi cosi’ comune
Con la nascita di Ajax si cominciavano a caricareVIDEO!
THE FILE UPLOAD PROBLEM
Caricare files via http non era poi cosi’ comune
Con la nascita di Ajax si cominciavano a caricareVIDEO!
Ed ecco un nuovo problema da affrontare:
LA PROGRESS BAR
LA PROGRESS BAR
Il DOM non dava alcuna informazione sul file
LA PROGRESS BAR
Il DOM non dava alcuna informazione sul file
Il trucco era controllare lo stato del file lato server in batch.
LA PROGRESS BAR
Il DOM non dava alcuna informazione sul file
Il trucco era controllare lo stato del file lato server in batch.
Ma l’http 1.1 ci da connessioni che possono restare aperte!
LA PROGRESS BAR
Il DOM non dava alcuna informazione sul file
Il trucco era controllare lo stato del file lato server in batch.
Ma l’http 1.1 ci da connessioni che possono restare aperte!
Nasce un interessante plugin per Mongrel
IL LONG POLLING
IL LONG POLLING
Non piu’ continue richieste Ajax temporizzate
IL LONG POLLING
Non piu’ continue richieste Ajax temporizzate
Il Web Server risponde e non chiude subito la connessione
IL LONG POLLING
Non piu’ continue richieste Ajax temporizzate
Il Web Server risponde e non chiude subito la connessione
La connessione resta aperta finche’ la si puo’ usare
IL LONG POLLING
Non piu’ continue richieste Ajax temporizzate
Il Web Server risponde e non chiude subito la connessione
La connessione resta aperta finche’ la si puo’ usare
Il Server continua a spedire lo stato del file fino al termine
IL WEB SERVER E’APPENA
DIVENTATO MOLTO PIU’
INTELLIGENTE! :)
MA...
IL WEB E’ANCORA LENTO!
IL WEB E’ANCORA LENTO!
Ruby, Python, ecc sono troppo lenti by design
IL WEB E’ANCORA LENTO!
Ruby, Python, ecc sono troppo lenti by design
Gli interpreti sono singoli thread bloccanti
IL WEB E’ANCORA LENTO!
Ruby, Python, ecc sono troppo lenti by design
Gli interpreti sono singoli thread bloccanti
Il C e’ veloce ma uno sconosciuto per troppi webdev
SI SPERIMENTA CON:
SI SPERIMENTA CON:
Ruby
SI SPERIMENTA CON:
Ruby
Python
SI SPERIMENTA CON:
Ruby
Python
Askel
L’OBIETTIVO:
L’OBIETTIVO:
Costruire un sistema libero da lock!
LA RISPOSTA:
LA RISPOSTA:
Tutto in un solo thread
LA RISPOSTA:
Tutto in un solo thread
Migliora?
LA RISPOSTA:
Tutto in un solo thread
Migliora?
SI! Si possono evitare tutti i problemi derivanti dai lock!
LA RISPOSTA:
Tutto in un solo thread
Migliora?
SI! Si possono evitare tutti i problemi derivanti dai lock!
C’e’ un linguaggio che tutto cio’ lo fa di natura:
JAVASCRIPT
JAVASCRIPT
Negli ultimi anni ha preso sempre piu’ piede
JAVASCRIPT
Negli ultimi anni ha preso sempre piu’ piede
Tutti i maggiori browser stavano gia’ “combattendo su js”
JAVASCRIPT
Negli ultimi anni ha preso sempre piu’ piede
Tutti i maggiori browser stavano gia’ “combattendo su js”
Nel 2008 era stato rilasciatoV8
JAVASCRIPT
Negli ultimi anni ha preso sempre piu’ piede
Tutti i maggiori browser stavano gia’ “combattendo su js”
Nel 2008 era stato rilasciatoV8
Ha le caratteristiche adatte:
JAVASCRIPT
Negli ultimi anni ha preso sempre piu’ piede
Tutti i maggiori browser stavano gia’ “combattendo su js”
Nel 2008 era stato rilasciatoV8
Ha le caratteristiche adatte:
Closures
JAVASCRIPT
Negli ultimi anni ha preso sempre piu’ piede
Tutti i maggiori browser stavano gia’ “combattendo su js”
Nel 2008 era stato rilasciatoV8
Ha le caratteristiche adatte:
Closures
Funzioni anonime
JAVASCRIPT
Negli ultimi anni ha preso sempre piu’ piede
Tutti i maggiori browser stavano gia’ “combattendo su js”
Nel 2008 era stato rilasciatoV8
Ha le caratteristiche adatte:
Closures
Funzioni anonime
Non e’ usato al di fuori dei browser
JAVASCRIPT
Negli ultimi anni ha preso sempre piu’ piede
Tutti i maggiori browser stavano gia’ “combattendo su js”
Nel 2008 era stato rilasciatoV8
Ha le caratteristiche adatte:
Closures
Funzioni anonime
Non e’ usato al di fuori dei browser
Quindi non ha preconcetti su come fare le cose.
NASCE NODE.JS
NASCE NODE.JS
Viene presentato alla javascript conf di Berlino
NASCE NODE.JS
Viene presentato alla javascript conf di Berlino
La prima app di demo: un IRC Server, 400 linee di codice!
NASCE NODE.JS
Viene presentato alla javascript conf di Berlino
La prima app di demo: un IRC Server, 400 linee di codice!
Ed e’ fatto per costruire network servers!
NASCE NODE.JS
Viene presentato alla javascript conf di Berlino
La prima app di demo: un IRC Server, 400 linee di codice!
Ed e’ fatto per costruire network servers!
Il suo nome indica che e’ fatto per essere un nodo tra molti
NASCE NODE.JS
Viene presentato alla javascript conf di Berlino
La prima app di demo: un IRC Server, 400 linee di codice!
Ed e’ fatto per costruire network servers!
Il suo nome indica che e’ fatto per essere un nodo tra molti
E’ adatto alla Cloud* per sua natura.
*Una volta si chiamava internet
MA...
È:
JAVASCRIPT
NEL
SERVER!
È:
JAVASCRIPT
NEL
SERVER!
È:
JAVASCRIPT
NEL
SERVER!
JAVASCRIPT
JAVASCRIPT
[]+[] =
JAVASCRIPT
[]+[] = ‘’
JAVASCRIPT
[]+[] = ‘’
[]+{} =
JAVASCRIPT
[]+[] = ‘’
[]+{} = [object Object]
JAVASCRIPT
[]+[] = ‘’
[]+{} = [object Object]
{}+[] =
JAVASCRIPT
[]+[] = ‘’
[]+{} = [object Object]
{}+[] = 0
JAVASCRIPT
[]+[] = ‘’
[]+{} = [object Object]
{}+[] = 0
{}+{} =
JAVASCRIPT
[]+[] = ‘’
[]+{} = [object Object]
{}+[] = 0
{}+{} = NaN
JAVASCRIPT
[]+[] = ‘’
[]+{} = [object Object]
{}+[] = 0
{}+{} = NaN
‘’-1 =
JAVASCRIPT
[]+[] = ‘’
[]+{} = [object Object]
{}+[] = 0
{}+{} = NaN
‘’-1 = -1
JAVASCRIPT
[]+[] = ‘’
[]+{} = [object Object]
{}+[] = 0
{}+{} = NaN
‘’-1 = -1
‘string’-1 =
JAVASCRIPT
[]+[] = ‘’
[]+{} = [object Object]
{}+[] = 0
{}+{} = NaN
‘’-1 = -1
‘string’-1 = NaN
PARLIAMONE...
SPEED:
SPEED:
“Javascript e’ lento”
SPEED:
“Javascript e’ lento”
sbagliato, e’ la DOM API ad essere lenta!
SPEED:
“Javascript e’ lento”
sbagliato, e’ la DOM API ad essere lenta!
“Per essere non-blocking non bisogna fare I/O”
SPEED:
“Javascript e’ lento”
sbagliato, e’ la DOM API ad essere lenta!
“Per essere non-blocking non bisogna fare I/O”
ma node gestisce l’I/O per noi!
SPEED:
“Javascript e’ lento”
sbagliato, e’ la DOM API ad essere lenta!
“Per essere non-blocking non bisogna fare I/O”
ma node gestisce l’I/O per noi!
“Operazioni cpu-bound saranno lente e bloccanti”
SPEED:
“Javascript e’ lento”
sbagliato, e’ la DOM API ad essere lenta!
“Per essere non-blocking non bisogna fare I/O”
ma node gestisce l’I/O per noi!
“Operazioni cpu-bound saranno lente e bloccanti”
node non nasce per questo genere di task,
comunqueV8 ci da un grosso aiuto:
credits: Daniel Clifford, Manager andTech LeadV8Team. (@Google I/O 2012)
ALTRO:
ALTRO:
“Necessita del proprio HTTP server interno”
ALTRO:
“Necessita del proprio HTTP server interno”
questo in realta’ e’ uno dei punti di forza di node
ed uno dei motivi per cui nasce
ALTRO:
“Necessita del proprio HTTP server interno”
questo in realta’ e’ uno dei punti di forza di node
ed uno dei motivi per cui nasce
“Necessita di cache/reverse proxy”
ALTRO:
“Necessita del proprio HTTP server interno”
questo in realta’ e’ uno dei punti di forza di node
ed uno dei motivi per cui nasce
“Necessita di cache/reverse proxy”
Nessuno al giorno d’oggi in produzione usa webserver
direttamente connessi ad internet,
i layer di apparati e logica sono ingenti
ALTRO:
“Necessita del proprio HTTP server interno”
questo in realta’ e’ uno dei punti di forza di node
ed uno dei motivi per cui nasce
“Necessita di cache/reverse proxy”
Nessuno al giorno d’oggi in produzione usa webserver
direttamente connessi ad internet,
i layer di apparati e logica sono ingenti
“Consuma molte risorse”
ALTRO:
“Necessita del proprio HTTP server interno”
questo in realta’ e’ uno dei punti di forza di node
ed uno dei motivi per cui nasce
“Necessita di cache/reverse proxy”
Nessuno al giorno d’oggi in produzione usa webserver
direttamente connessi ad internet,
i layer di apparati e logica sono ingenti
“Consuma molte risorse”
Le esperienze pratiche dimostrano ben altro, con
performaces impressionanti (rif: linkedin)
EBBENE SI’, SIAMO DEGLI
IDIOTI E LO USIAMO
SERIAMENTE! ;)
FATTI: IL COSTO DELL’I/O
• cache L1: 3 cicli
• cache L2: 14 cicli
• RAM: 250 cicli
• Disco: 41x10^6 cicli
• Network: 240x10^6 cicli
ASYNC E NEXTTICK
ASYNC E NEXTTICK
Il nostro codice javascript gira in un solo thread
ASYNC E NEXTTICK
Il nostro codice javascript gira in un solo thread
Node utilizza poi un thread-pool per gestire l’I/O
ASYNC E NEXTTICK
Ogni thread ha una coda di task ad eseguire
Il nostro codice javascript gira in un solo thread
Node utilizza poi un thread-pool per gestire l’I/O
ASYNC E NEXTTICK
Ogni thread ha una coda di task ad eseguire
Il nostro codice javascript gira in un solo thread
Node utilizza poi un thread-pool per gestire l’I/O
Ad ogniTick viene consumato un task nella coda
ASYNC E NEXTTICK
Ogni thread ha una coda di task ad eseguire
Il nostro codice javascript gira in un solo thread
Node utilizza poi un thread-pool per gestire l’I/O
Ad ogniTick viene consumato un task nella coda
Non dobbiamo curarci di problemi di concorrenza
//	
  Good:	
  write	
  files	
  asynchronously
fs.writeFile('message.txt',	
  'Hello	
  Node',	
  func@on	
  (err)	
  {
	
  	
  console.log("It's	
  saved	
  and	
  the	
  server	
  remains	
  responsive!");
});
//	
  BAD:	
  write	
  files	
  synchronously
fs.writeFileSync('message.txt',	
  'Hello	
  Node');
console.log("It's	
  saved,	
  but	
  you	
  just	
  blocked	
  ALL	
  requests!");
ASYNC VS SYNC
var http = require('http');
var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Hello Worldn");
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
HTTP SERVER
var http = require('http');
var server = http.createServer(function (request, response) {
var data = fs.readFileSync('message.txt');
	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
  	
  	
  [ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
SYNC READ AND DELIVER:
CPU FileSystem Network
var http = require('http');
var server = http.createServer(function (request, response) {
var data = fs.readFileSync('message.txt');
	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
  	
  	
  [ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
SYNC READ AND DELIVER:
CPU FileSystem Network
var http = require('http');
var server = http.createServer(function (request, response) {
var data = fs.readFileSync('message.txt');
	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
  	
  	
  [ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
SYNC READ AND DELIVER:
CPU FileSystem Network
var http = require('http');
var server = http.createServer(function (request, response) {
var data = fs.readFileSync('message.txt');
	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
  	
  	
  [ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
SYNC READ AND DELIVER:
CPU FileSystem Network
var http = require('http');
var server = http.createServer(function (request, response) {
var data = fs.readFileSync('message.txt');
	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
  	
  	
  [ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
SYNC READ AND DELIVER:
CPU FileSystem Network
var http = require('http');
var server = http.createServer(function (request, response) {
fs.readFile('message.txt', function (err, data) {
	
  	
  	
  	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
   });
[ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
ASYNC READ AND DELIVER:
CPU FileSystem Network
var http = require('http');
var server = http.createServer(function (request, response) {
fs.readFile('message.txt', function (err, data) {
	
  	
  	
  	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
   });
[ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
ASYNC READ AND DELIVER:
CPU FileSystem Network
var http = require('http');
var server = http.createServer(function (request, response) {
fs.readFile('message.txt', function (err, data) {
	
  	
  	
  	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
   });
[ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
ASYNC READ AND DELIVER:
CPU FileSystem Network
var http = require('http');
var server = http.createServer(function (request, response) {
fs.readFile('message.txt', function (err, data) {
	
  	
  	
  	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
   });
[ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
ASYNC READ AND DELIVER:
CPU FileSystem Network
var http = require('http');
var server = http.createServer(function (request, response) {
fs.readFile('message.txt', function (err, data) {
	
  	
  	
  	
  	
  	
  	
  	
  	
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end(data.toString());
	
  	
  	
   });
[ ... altri task ...]
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
ASYNC READ AND DELIVER:
CPU FileSystem Network
SYNC READ AND DELIVER:
CPU FileSystem Network
ASYNC READ AND DELIVER:
NODE DOC CIT.
users of Node are free from worries of dead-locking the
process there are no locks.Almost no function in Node
directly performs I/O, so the process never blocks. Because
nothing blocks, less-than-expert programmers are able to
develop fast systems.
[...]
Node simply enters the event loop after executing the input
script. Node exits the event loop when there are no more
callbacks to perform.This behavior is like browser javascript
the event loop is hidden from the user.
https://github.com/joyent/libuv/blob/master/src/unix/threadpool.c#L32
var	
  server	
  =	
  require('./lib/node-­‐router').getServer();
server.get("/json",	
  func@on	
  (req,	
  res,	
  match)	
  {
	
  	
  return	
  {hello:	
  "World"};
});
server.post(new	
  RegExp("^/(.*)$"),	
  func@on	
  hello(req,	
  res,	
  match)	
  {
	
  	
  return	
  "Hello	
  "	
  +	
  (match	
  ||	
  "World")	
  +	
  "!";
});
server.listen(8080);
REST API
sfruttando una semplice libreria siamo subito piu’ comodi
Internet
The Cloud!
PRIMA:
PRIMA:
Server dedicati o server condivisi
PRIMA:
Server dedicati o server condivisi
POI:
PRIMA:
Server dedicati o server condivisi
POI:
I server vengono virtualizzati: leVPS
ARRIVA LA CLOUD:
ARRIVA LA CLOUD:
PaaS: Platform as a Service
ARRIVA LA CLOUD:
PaaS: Platform as a Service
le nostre aplicazioni girano in contenitori virtuali
ARRIVA LA CLOUD:
PaaS: Platform as a Service
le nostre aplicazioni girano in contenitori virtuali
i contenitori vengono replicati regionalmente
ARRIVA LA CLOUD:
PaaS: Platform as a Service
le nostre aplicazioni girano in contenitori virtuali
i contenitori vengono replicati regionalmente
anche leVPS imparano questi nuovi “trucchi “
VANTAGGI:
VANTAGGI:
e’ decisamente piu’ semplice scalare globalmente
VANTAGGI:
e’ decisamente piu’ semplice scalare globalmente
non dobbiamo piu’ gestire l’infrastruttura
VANTAGGI:
e’ decisamente piu’ semplice scalare globalmente
non dobbiamo piu’ gestire l’infrastruttura
pay per use
VANTAGGI:
e’ decisamente piu’ semplice scalare globalmente
non dobbiamo piu’ gestire l’infrastruttura
pay per use
aumentiamo o diminuiamo le nostre istanze con un click
VANTAGGI:
e’ decisamente piu’ semplice scalare globalmente
non dobbiamo piu’ gestire l’infrastruttura
pay per use
aumentiamo o diminuiamo le nostre istanze con un click
Il deploy si risolve con un git push!
MA...*E te pareva...
MA...
il nostro stack diventa “blando”
MA...
il nostro stack diventa “blando”
impatto piu’ evidente: le sessions
MA...
il nostro stack diventa “blando”
impatto piu’ evidente: le sessions
soluzioni come memcache o session-on-db
si rivelano spesso “corte” e costose
MA...
il nostro stack diventa “blando”
impatto piu’ evidente: le sessions
soluzioni come memcache o session-on-db
si rivelano spesso “corte” e costose
soluzione: data driven single page application
MA...
il nostro stack diventa “blando”
impatto piu’ evidente: le sessions
soluzioni come memcache o session-on-db
si rivelano spesso “corte” e costose
soluzione: data driven single page application
possiamo mutare il backend in web API! meglio se real time*
*E chi e’ bravo nel real time? :)
MA...
il nostro stack diventa “blando”
impatto piu’ evidente: le sessions
soluzioni come memcache o session-on-db
si rivelano spesso “corte” e costose
soluzione: data driven single page application
possiamo mutare il backend in web API! meglio se real time*
*E chi e’ bravo nel real time? :)
sfruttiamo a pieno la OOP: piu’ siamo puliti piu’ vantaggi.
MA...
il nostro stack diventa “blando”
impatto piu’ evidente: le sessions
soluzioni come memcache o session-on-db
si rivelano spesso “corte” e costose
soluzione: data driven single page application
possiamo mutare il backend in web API! meglio se real time*
*E chi e’ bravo nel real time? :)
sfruttiamo a pieno la OOP: piu’ siamo puliti piu’ vantaggi.
oggetti piccoli e specializzati risultano piu’ facili da distribuire
MA...
il nostro stack diventa “blando”
impatto piu’ evidente: le sessions
soluzioni come memcache o session-on-db
si rivelano spesso “corte” e costose
soluzione: data driven single page application
possiamo mutare il backend in web API! meglio se real time*
*E chi e’ bravo nel real time? :)
sfruttiamo a pieno la OOP: piu’ siamo puliti piu’ vantaggi.
oggetti piccoli e specializzati risultano piu’ facili da distribuire
con l’aiuto di bus e code distribuiamo i processi nei paas
E NODE?
E NODE?
beh, nodejs ci va a nozze!
E NODE?
beh, nodejs ci va a nozze!
il modello single thread e’ perfetto per i Paas
E NODE?
beh, nodejs ci va a nozze!
il modello single thread e’ perfetto per i Paas
i moduli possono essere distruibuiti facilmente
essendo ad eventi va in idle quando non lavora e costa meno
E NODE?
beh, nodejs ci va a nozze!
il modello single thread e’ perfetto per i Paas
i moduli possono essere distruibuiti facilmente
essendo ad eventi va in idle quando non lavora e costa meno
sfruttando l’async rispondiamo valocemente all’utente
demandando elaborazioni successive o costose in callbacks,
processi o istanze diverse distrubuendo meglio il carico
User NODE
NODE
Client Web Engine
Database
Logging facility
Mass storage
(big slow disk)
DB
Disk
ESEMPIO DI ARCHITETTURA
In questo modo i logs non rallentano piu’ i processi critici
backend
server
Mobile client
NodeJs
instances
Mobile Client
ESEMPIO: LINKEDIN
Linkedin usa node.js come middleware layer tra il backend e le
applicazioni mobile
backend
server
Mobile client
NodeJs
instances
Mobile Client
ESEMPIO: LINKEDIN
Linkedin usa node.js come middleware layer tra il backend e le
applicazioni mobile
backend
server
Mobile client
NodeJs
instances
Mobile Client
ESEMPIO: LINKEDIN
Linkedin usa node.js come middleware layer tra il backend e le
applicazioni mobile
VANTAGGI:
backend
server
Mobile client
NodeJs
instances
Mobile Client
ESEMPIO: LINKEDIN
Linkedin usa node.js come middleware layer tra il backend e le
applicazioni mobile
VANTAGGI:
migliori prestazioni: node si rivela 20x piu’ veloce di Rails
backend
server
Mobile client
NodeJs
instances
Mobile Client
ESEMPIO: LINKEDIN
Linkedin usa node.js come middleware layer tra il backend e le
applicazioni mobile
VANTAGGI:
migliori prestazioni: node si rivela 20x piu’ veloce di Rails
l’infrastruttura passa da 30 a 3 server
lasciando sufficienti risorse per scalare di 10 volte il traffico!
UN CASO COMPLESSO
Il backend di SaveThe Mom e’ tutto in node.js e ne sfrutta
pesantemente il modello asincrono con l’aiuto di bus e code
ED ORA: UN PO’ DI SPAM :)
HTTP://NODEJSCONF.IT
ED ORA: UN PO’ DI SPAM :)
HTTP://WEBDEBS.ORG
TROLLATECI SUTWITTER!
@UNLUCIO @GANDELLINUX
TROLLATECI SUTWITTER!
@UNLUCIO @GANDELLINUX
Grazie :)

Contenu connexe

En vedette

Daniele Dellafiore - No-Backend Web Architecture | Codemotion Milan 2015
Daniele Dellafiore - No-Backend Web Architecture | Codemotion Milan 2015Daniele Dellafiore - No-Backend Web Architecture | Codemotion Milan 2015
Daniele Dellafiore - No-Backend Web Architecture | Codemotion Milan 2015Codemotion
 
Apache Cordova: Overview and Introduction
Apache Cordova: Overview and IntroductionApache Cordova: Overview and Introduction
Apache Cordova: Overview and IntroductionGabriele Falasca
 
Microsoft Integration Platform
Microsoft Integration PlatformMicrosoft Integration Platform
Microsoft Integration PlatformFabio Cozzolino
 
Costruire app per WinPhone, iOS e Android con C# e Xamarin
Costruire app per WinPhone, iOS e Android con C# e XamarinCostruire app per WinPhone, iOS e Android con C# e Xamarin
Costruire app per WinPhone, iOS e Android con C# e XamarinFabio Cozzolino
 
Enough talking - it's time to start doing
Enough talking - it's time to start doingEnough talking - it's time to start doing
Enough talking - it's time to start doingApigee | Google Cloud
 
Introduzione ai Microservices
Introduzione ai MicroservicesIntroduzione ai Microservices
Introduzione ai MicroservicesDaniele Mondello
 
Just Add Reality: Managing Logistics with the Uber Developer Platform
Just Add Reality: Managing Logistics with the Uber Developer PlatformJust Add Reality: Managing Logistics with the Uber Developer Platform
Just Add Reality: Managing Logistics with the Uber Developer PlatformApigee | Google Cloud
 
(DEV203) Amazon API Gateway & AWS Lambda to Build Secure APIs
(DEV203) Amazon API Gateway & AWS Lambda to Build Secure APIs(DEV203) Amazon API Gateway & AWS Lambda to Build Secure APIs
(DEV203) Amazon API Gateway & AWS Lambda to Build Secure APIsAmazon Web Services
 
Are ESBs Relevant in the Age of Microservices?
Are ESBs Relevant in the Age of Microservices?Are ESBs Relevant in the Age of Microservices?
Are ESBs Relevant in the Age of Microservices?Apigee | Google Cloud
 
What's Better than Microservices? Serverless Microservices.
What's Better than Microservices? Serverless Microservices.What's Better than Microservices? Serverless Microservices.
What's Better than Microservices? Serverless Microservices.Apigee | Google Cloud
 
Build and Manage Your APIs with Amazon API Gateway
Build and Manage Your APIs with Amazon API GatewayBuild and Manage Your APIs with Amazon API Gateway
Build and Manage Your APIs with Amazon API GatewayAmazon Web Services
 
Platforms, Cloud-Native Architectures, and APIs: Chicago Adapt or Die Keynote
Platforms, Cloud-Native Architectures, and APIs: Chicago Adapt or Die KeynotePlatforms, Cloud-Native Architectures, and APIs: Chicago Adapt or Die Keynote
Platforms, Cloud-Native Architectures, and APIs: Chicago Adapt or Die KeynoteApigee | Google Cloud
 

En vedette (14)

Daniele Dellafiore - No-Backend Web Architecture | Codemotion Milan 2015
Daniele Dellafiore - No-Backend Web Architecture | Codemotion Milan 2015Daniele Dellafiore - No-Backend Web Architecture | Codemotion Milan 2015
Daniele Dellafiore - No-Backend Web Architecture | Codemotion Milan 2015
 
Git in 5 minuti
Git in 5 minutiGit in 5 minuti
Git in 5 minuti
 
Apache Cordova: Overview and Introduction
Apache Cordova: Overview and IntroductionApache Cordova: Overview and Introduction
Apache Cordova: Overview and Introduction
 
Microsoft Integration Platform
Microsoft Integration PlatformMicrosoft Integration Platform
Microsoft Integration Platform
 
Costruire app per WinPhone, iOS e Android con C# e Xamarin
Costruire app per WinPhone, iOS e Android con C# e XamarinCostruire app per WinPhone, iOS e Android con C# e Xamarin
Costruire app per WinPhone, iOS e Android con C# e Xamarin
 
Think open IoT
Think open IoTThink open IoT
Think open IoT
 
Enough talking - it's time to start doing
Enough talking - it's time to start doingEnough talking - it's time to start doing
Enough talking - it's time to start doing
 
Introduzione ai Microservices
Introduzione ai MicroservicesIntroduzione ai Microservices
Introduzione ai Microservices
 
Just Add Reality: Managing Logistics with the Uber Developer Platform
Just Add Reality: Managing Logistics with the Uber Developer PlatformJust Add Reality: Managing Logistics with the Uber Developer Platform
Just Add Reality: Managing Logistics with the Uber Developer Platform
 
(DEV203) Amazon API Gateway & AWS Lambda to Build Secure APIs
(DEV203) Amazon API Gateway & AWS Lambda to Build Secure APIs(DEV203) Amazon API Gateway & AWS Lambda to Build Secure APIs
(DEV203) Amazon API Gateway & AWS Lambda to Build Secure APIs
 
Are ESBs Relevant in the Age of Microservices?
Are ESBs Relevant in the Age of Microservices?Are ESBs Relevant in the Age of Microservices?
Are ESBs Relevant in the Age of Microservices?
 
What's Better than Microservices? Serverless Microservices.
What's Better than Microservices? Serverless Microservices.What's Better than Microservices? Serverless Microservices.
What's Better than Microservices? Serverless Microservices.
 
Build and Manage Your APIs with Amazon API Gateway
Build and Manage Your APIs with Amazon API GatewayBuild and Manage Your APIs with Amazon API Gateway
Build and Manage Your APIs with Amazon API Gateway
 
Platforms, Cloud-Native Architectures, and APIs: Chicago Adapt or Die Keynote
Platforms, Cloud-Native Architectures, and APIs: Chicago Adapt or Die KeynotePlatforms, Cloud-Native Architectures, and APIs: Chicago Adapt or Die Keynote
Platforms, Cloud-Native Architectures, and APIs: Chicago Adapt or Die Keynote
 

Similaire à Node and the Cloud

Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101DotNetCampus
 
Introduzione alla localizzazione web
Introduzione alla localizzazione webIntroduzione alla localizzazione web
Introduzione alla localizzazione webQabiria
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaXPeppers
 
Sviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle MonorailSviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle MonorailDotNetMarche
 
Introduzione a Ruby On Rails
Introduzione a Ruby On RailsIntroduzione a Ruby On Rails
Introduzione a Ruby On RailsLuca Mearelli
 
Working between the clouds (versione completa)
Working between the clouds (versione completa)Working between the clouds (versione completa)
Working between the clouds (versione completa)Davide Cerbo
 
Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailStefano Ottaviani
 
SQL Saturday 871 - Sardegna 2019 - SQL Server DR on Azure
SQL Saturday 871 - Sardegna 2019 - SQL Server DR on AzureSQL Saturday 871 - Sardegna 2019 - SQL Server DR on Azure
SQL Saturday 871 - Sardegna 2019 - SQL Server DR on AzureMarco Obinu
 
Angular e asp.net core: un framework sul framework
Angular e asp.net core: un framework sul frameworkAngular e asp.net core: un framework sul framework
Angular e asp.net core: un framework sul frameworkMichele Aponte
 
node.js e Postgresql
node.js e Postgresqlnode.js e Postgresql
node.js e PostgresqlLucio Grenzi
 
Win05 accesso ai dati in win 8
Win05   accesso ai dati in win 8Win05   accesso ai dati in win 8
Win05 accesso ai dati in win 8DotNetCampus
 
Dal cloud al mobile con tecnologie Google
Dal cloud al mobile con tecnologie GoogleDal cloud al mobile con tecnologie Google
Dal cloud al mobile con tecnologie GoogleDiego Giorgini
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webAndrea Dottor
 
DrupalDay 2014: AngularJS + IonicFramework + Drupal Services
DrupalDay 2014: AngularJS + IonicFramework + Drupal ServicesDrupalDay 2014: AngularJS + IonicFramework + Drupal Services
DrupalDay 2014: AngularJS + IonicFramework + Drupal ServicesMichel Morelli
 

Similaire à Node and the Cloud (20)

Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101
 
Introduzione alla localizzazione web
Introduzione alla localizzazione webIntroduzione alla localizzazione web
Introduzione alla localizzazione web
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastruttura
 
HTML5, il lato client della forza...
HTML5, il lato client della forza... HTML5, il lato client della forza...
HTML5, il lato client della forza...
 
Html5
Html5Html5
Html5
 
Sviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle MonorailSviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle Monorail
 
Introduzione a Ruby On Rails
Introduzione a Ruby On RailsIntroduzione a Ruby On Rails
Introduzione a Ruby On Rails
 
Working between the clouds (versione completa)
Working between the clouds (versione completa)Working between the clouds (versione completa)
Working between the clouds (versione completa)
 
Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRail
 
SQL Saturday 871 - Sardegna 2019 - SQL Server DR on Azure
SQL Saturday 871 - Sardegna 2019 - SQL Server DR on AzureSQL Saturday 871 - Sardegna 2019 - SQL Server DR on Azure
SQL Saturday 871 - Sardegna 2019 - SQL Server DR on Azure
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 
Angular e asp.net core: un framework sul framework
Angular e asp.net core: un framework sul frameworkAngular e asp.net core: un framework sul framework
Angular e asp.net core: un framework sul framework
 
Tile server
Tile serverTile server
Tile server
 
node.js e Postgresql
node.js e Postgresqlnode.js e Postgresql
node.js e Postgresql
 
Win05 accesso ai dati in win 8
Win05   accesso ai dati in win 8Win05   accesso ai dati in win 8
Win05 accesso ai dati in win 8
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 
Dal cloud al mobile con tecnologie Google
Dal cloud al mobile con tecnologie GoogleDal cloud al mobile con tecnologie Google
Dal cloud al mobile con tecnologie Google
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
 
DrupalDay 2014: AngularJS + IonicFramework + Drupal Services
DrupalDay 2014: AngularJS + IonicFramework + Drupal ServicesDrupalDay 2014: AngularJS + IonicFramework + Drupal Services
DrupalDay 2014: AngularJS + IonicFramework + Drupal Services
 

Node and the Cloud

  • 2.
  • 3. Luciano Colosio @unlucio CTO @ SaveTheMom Inc. Federico Gandellini @gandellinux Freelance Developer
  • 4. INDEX • Node.js: la storia • Node.js distilled: SyncVS Async • Clouding • Uso di node come Backend API
  • 5. Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. CurrentVersion: v0.8.21
  • 7. RYAN DAHL Studente in Matematica Si trasferisce in Sud America Incontra un programmatore php Inizia a sviluppare siti ed “applicazioni” web Incontra ROR Si accorge che il Web e’ lento!
  • 8. Il Web e’ lento! Per via di Java ;)
  • 9. Il Web e’ lento! Alcuni cominciano a lavorare per velocizzare ROR
  • 10. Il Web e’ lento! Alcuni cominciano a lavorare per velocizzare ROR Ma il problema risiede nell’intero stack
  • 11. Il Web e’ lento! Alcuni cominciano a lavorare per velocizzare ROR Ma il problema risiede nell’intero stack Il lavoro di Zed Shaw da vita a Mongrel
  • 13. Mongrel E’ sia una libreria http, sia un webserver!
  • 14. Mongrel E’ sia una libreria http, sia un webserver! Il web server non e’ piu’ solo “una directory “
  • 15. Mongrel E’ sia una libreria http, sia un webserver! Il web server non e’ piu’ solo “una directory “ Puo’ racchiudere direttamente la logica
  • 17. Il Web Server Distillato, e’ fatto per gestire richieste e risposte
  • 18. Il Web Server Distillato, e’ fatto per gestire richieste e risposte Servire files e’ una parte ma non e’ obbligatoria
  • 19. THE FILE UPLOAD PROBLEM
  • 20. THE FILE UPLOAD PROBLEM Caricare files via http non era poi cosi’ comune
  • 21. THE FILE UPLOAD PROBLEM Caricare files via http non era poi cosi’ comune Con la nascita di Ajax si cominciavano a caricareVIDEO!
  • 22. THE FILE UPLOAD PROBLEM Caricare files via http non era poi cosi’ comune Con la nascita di Ajax si cominciavano a caricareVIDEO! Ed ecco un nuovo problema da affrontare:
  • 24. LA PROGRESS BAR Il DOM non dava alcuna informazione sul file
  • 25. LA PROGRESS BAR Il DOM non dava alcuna informazione sul file Il trucco era controllare lo stato del file lato server in batch.
  • 26. LA PROGRESS BAR Il DOM non dava alcuna informazione sul file Il trucco era controllare lo stato del file lato server in batch. Ma l’http 1.1 ci da connessioni che possono restare aperte!
  • 27. LA PROGRESS BAR Il DOM non dava alcuna informazione sul file Il trucco era controllare lo stato del file lato server in batch. Ma l’http 1.1 ci da connessioni che possono restare aperte! Nasce un interessante plugin per Mongrel
  • 29. IL LONG POLLING Non piu’ continue richieste Ajax temporizzate
  • 30. IL LONG POLLING Non piu’ continue richieste Ajax temporizzate Il Web Server risponde e non chiude subito la connessione
  • 31. IL LONG POLLING Non piu’ continue richieste Ajax temporizzate Il Web Server risponde e non chiude subito la connessione La connessione resta aperta finche’ la si puo’ usare
  • 32. IL LONG POLLING Non piu’ continue richieste Ajax temporizzate Il Web Server risponde e non chiude subito la connessione La connessione resta aperta finche’ la si puo’ usare Il Server continua a spedire lo stato del file fino al termine
  • 33. IL WEB SERVER E’APPENA DIVENTATO MOLTO PIU’ INTELLIGENTE! :)
  • 34. MA...
  • 36. IL WEB E’ANCORA LENTO! Ruby, Python, ecc sono troppo lenti by design
  • 37. IL WEB E’ANCORA LENTO! Ruby, Python, ecc sono troppo lenti by design Gli interpreti sono singoli thread bloccanti
  • 38. IL WEB E’ANCORA LENTO! Ruby, Python, ecc sono troppo lenti by design Gli interpreti sono singoli thread bloccanti Il C e’ veloce ma uno sconosciuto per troppi webdev
  • 46. LA RISPOSTA: Tutto in un solo thread
  • 47. LA RISPOSTA: Tutto in un solo thread Migliora?
  • 48. LA RISPOSTA: Tutto in un solo thread Migliora? SI! Si possono evitare tutti i problemi derivanti dai lock!
  • 49. LA RISPOSTA: Tutto in un solo thread Migliora? SI! Si possono evitare tutti i problemi derivanti dai lock! C’e’ un linguaggio che tutto cio’ lo fa di natura:
  • 51. JAVASCRIPT Negli ultimi anni ha preso sempre piu’ piede
  • 52. JAVASCRIPT Negli ultimi anni ha preso sempre piu’ piede Tutti i maggiori browser stavano gia’ “combattendo su js”
  • 53. JAVASCRIPT Negli ultimi anni ha preso sempre piu’ piede Tutti i maggiori browser stavano gia’ “combattendo su js” Nel 2008 era stato rilasciatoV8
  • 54. JAVASCRIPT Negli ultimi anni ha preso sempre piu’ piede Tutti i maggiori browser stavano gia’ “combattendo su js” Nel 2008 era stato rilasciatoV8 Ha le caratteristiche adatte:
  • 55. JAVASCRIPT Negli ultimi anni ha preso sempre piu’ piede Tutti i maggiori browser stavano gia’ “combattendo su js” Nel 2008 era stato rilasciatoV8 Ha le caratteristiche adatte: Closures
  • 56. JAVASCRIPT Negli ultimi anni ha preso sempre piu’ piede Tutti i maggiori browser stavano gia’ “combattendo su js” Nel 2008 era stato rilasciatoV8 Ha le caratteristiche adatte: Closures Funzioni anonime
  • 57. JAVASCRIPT Negli ultimi anni ha preso sempre piu’ piede Tutti i maggiori browser stavano gia’ “combattendo su js” Nel 2008 era stato rilasciatoV8 Ha le caratteristiche adatte: Closures Funzioni anonime Non e’ usato al di fuori dei browser
  • 58. JAVASCRIPT Negli ultimi anni ha preso sempre piu’ piede Tutti i maggiori browser stavano gia’ “combattendo su js” Nel 2008 era stato rilasciatoV8 Ha le caratteristiche adatte: Closures Funzioni anonime Non e’ usato al di fuori dei browser Quindi non ha preconcetti su come fare le cose.
  • 60. NASCE NODE.JS Viene presentato alla javascript conf di Berlino
  • 61. NASCE NODE.JS Viene presentato alla javascript conf di Berlino La prima app di demo: un IRC Server, 400 linee di codice!
  • 62. NASCE NODE.JS Viene presentato alla javascript conf di Berlino La prima app di demo: un IRC Server, 400 linee di codice! Ed e’ fatto per costruire network servers!
  • 63. NASCE NODE.JS Viene presentato alla javascript conf di Berlino La prima app di demo: un IRC Server, 400 linee di codice! Ed e’ fatto per costruire network servers! Il suo nome indica che e’ fatto per essere un nodo tra molti
  • 64. NASCE NODE.JS Viene presentato alla javascript conf di Berlino La prima app di demo: un IRC Server, 400 linee di codice! Ed e’ fatto per costruire network servers! Il suo nome indica che e’ fatto per essere un nodo tra molti E’ adatto alla Cloud* per sua natura. *Una volta si chiamava internet
  • 65. MA...
  • 73. JAVASCRIPT []+[] = ‘’ []+{} = [object Object]
  • 74. JAVASCRIPT []+[] = ‘’ []+{} = [object Object] {}+[] =
  • 75. JAVASCRIPT []+[] = ‘’ []+{} = [object Object] {}+[] = 0
  • 76. JAVASCRIPT []+[] = ‘’ []+{} = [object Object] {}+[] = 0 {}+{} =
  • 77. JAVASCRIPT []+[] = ‘’ []+{} = [object Object] {}+[] = 0 {}+{} = NaN
  • 78. JAVASCRIPT []+[] = ‘’ []+{} = [object Object] {}+[] = 0 {}+{} = NaN ‘’-1 =
  • 79. JAVASCRIPT []+[] = ‘’ []+{} = [object Object] {}+[] = 0 {}+{} = NaN ‘’-1 = -1
  • 80. JAVASCRIPT []+[] = ‘’ []+{} = [object Object] {}+[] = 0 {}+{} = NaN ‘’-1 = -1 ‘string’-1 =
  • 81. JAVASCRIPT []+[] = ‘’ []+{} = [object Object] {}+[] = 0 {}+{} = NaN ‘’-1 = -1 ‘string’-1 = NaN
  • 82.
  • 83.
  • 87. SPEED: “Javascript e’ lento” sbagliato, e’ la DOM API ad essere lenta!
  • 88. SPEED: “Javascript e’ lento” sbagliato, e’ la DOM API ad essere lenta! “Per essere non-blocking non bisogna fare I/O”
  • 89. SPEED: “Javascript e’ lento” sbagliato, e’ la DOM API ad essere lenta! “Per essere non-blocking non bisogna fare I/O” ma node gestisce l’I/O per noi!
  • 90. SPEED: “Javascript e’ lento” sbagliato, e’ la DOM API ad essere lenta! “Per essere non-blocking non bisogna fare I/O” ma node gestisce l’I/O per noi! “Operazioni cpu-bound saranno lente e bloccanti”
  • 91. SPEED: “Javascript e’ lento” sbagliato, e’ la DOM API ad essere lenta! “Per essere non-blocking non bisogna fare I/O” ma node gestisce l’I/O per noi! “Operazioni cpu-bound saranno lente e bloccanti” node non nasce per questo genere di task, comunqueV8 ci da un grosso aiuto:
  • 92. credits: Daniel Clifford, Manager andTech LeadV8Team. (@Google I/O 2012)
  • 94. ALTRO: “Necessita del proprio HTTP server interno”
  • 95. ALTRO: “Necessita del proprio HTTP server interno” questo in realta’ e’ uno dei punti di forza di node ed uno dei motivi per cui nasce
  • 96. ALTRO: “Necessita del proprio HTTP server interno” questo in realta’ e’ uno dei punti di forza di node ed uno dei motivi per cui nasce “Necessita di cache/reverse proxy”
  • 97. ALTRO: “Necessita del proprio HTTP server interno” questo in realta’ e’ uno dei punti di forza di node ed uno dei motivi per cui nasce “Necessita di cache/reverse proxy” Nessuno al giorno d’oggi in produzione usa webserver direttamente connessi ad internet, i layer di apparati e logica sono ingenti
  • 98. ALTRO: “Necessita del proprio HTTP server interno” questo in realta’ e’ uno dei punti di forza di node ed uno dei motivi per cui nasce “Necessita di cache/reverse proxy” Nessuno al giorno d’oggi in produzione usa webserver direttamente connessi ad internet, i layer di apparati e logica sono ingenti “Consuma molte risorse”
  • 99. ALTRO: “Necessita del proprio HTTP server interno” questo in realta’ e’ uno dei punti di forza di node ed uno dei motivi per cui nasce “Necessita di cache/reverse proxy” Nessuno al giorno d’oggi in produzione usa webserver direttamente connessi ad internet, i layer di apparati e logica sono ingenti “Consuma molte risorse” Le esperienze pratiche dimostrano ben altro, con performaces impressionanti (rif: linkedin)
  • 100. EBBENE SI’, SIAMO DEGLI IDIOTI E LO USIAMO SERIAMENTE! ;)
  • 101. FATTI: IL COSTO DELL’I/O • cache L1: 3 cicli • cache L2: 14 cicli • RAM: 250 cicli • Disco: 41x10^6 cicli • Network: 240x10^6 cicli
  • 103. ASYNC E NEXTTICK Il nostro codice javascript gira in un solo thread
  • 104. ASYNC E NEXTTICK Il nostro codice javascript gira in un solo thread Node utilizza poi un thread-pool per gestire l’I/O
  • 105. ASYNC E NEXTTICK Ogni thread ha una coda di task ad eseguire Il nostro codice javascript gira in un solo thread Node utilizza poi un thread-pool per gestire l’I/O
  • 106. ASYNC E NEXTTICK Ogni thread ha una coda di task ad eseguire Il nostro codice javascript gira in un solo thread Node utilizza poi un thread-pool per gestire l’I/O Ad ogniTick viene consumato un task nella coda
  • 107. ASYNC E NEXTTICK Ogni thread ha una coda di task ad eseguire Il nostro codice javascript gira in un solo thread Node utilizza poi un thread-pool per gestire l’I/O Ad ogniTick viene consumato un task nella coda Non dobbiamo curarci di problemi di concorrenza
  • 108. //  Good:  write  files  asynchronously fs.writeFile('message.txt',  'Hello  Node',  func@on  (err)  {    console.log("It's  saved  and  the  server  remains  responsive!"); }); //  BAD:  write  files  synchronously fs.writeFileSync('message.txt',  'Hello  Node'); console.log("It's  saved,  but  you  just  blocked  ALL  requests!"); ASYNC VS SYNC
  • 109. var http = require('http'); var server = http.createServer(function (request, response) {   response.writeHead(200, {"Content-Type": "text/plain"});   response.end("Hello Worldn"); }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); HTTP SERVER
  • 110. var http = require('http'); var server = http.createServer(function (request, response) { var data = fs.readFileSync('message.txt');            response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());          [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); SYNC READ AND DELIVER: CPU FileSystem Network
  • 111. var http = require('http'); var server = http.createServer(function (request, response) { var data = fs.readFileSync('message.txt');            response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());          [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); SYNC READ AND DELIVER: CPU FileSystem Network
  • 112. var http = require('http'); var server = http.createServer(function (request, response) { var data = fs.readFileSync('message.txt');            response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());          [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); SYNC READ AND DELIVER: CPU FileSystem Network
  • 113. var http = require('http'); var server = http.createServer(function (request, response) { var data = fs.readFileSync('message.txt');            response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());          [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); SYNC READ AND DELIVER: CPU FileSystem Network
  • 114. var http = require('http'); var server = http.createServer(function (request, response) { var data = fs.readFileSync('message.txt');            response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());          [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); SYNC READ AND DELIVER: CPU FileSystem Network
  • 115. var http = require('http'); var server = http.createServer(function (request, response) { fs.readFile('message.txt', function (err, data) {                  response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());       }); [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); ASYNC READ AND DELIVER: CPU FileSystem Network
  • 116. var http = require('http'); var server = http.createServer(function (request, response) { fs.readFile('message.txt', function (err, data) {                  response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());       }); [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); ASYNC READ AND DELIVER: CPU FileSystem Network
  • 117. var http = require('http'); var server = http.createServer(function (request, response) { fs.readFile('message.txt', function (err, data) {                  response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());       }); [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); ASYNC READ AND DELIVER: CPU FileSystem Network
  • 118. var http = require('http'); var server = http.createServer(function (request, response) { fs.readFile('message.txt', function (err, data) {                  response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());       }); [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); ASYNC READ AND DELIVER: CPU FileSystem Network
  • 119. var http = require('http'); var server = http.createServer(function (request, response) { fs.readFile('message.txt', function (err, data) {                  response.writeHead(200, {"Content-Type": "text/plain"});   response.end(data.toString());       }); [ ... altri task ...] }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); ASYNC READ AND DELIVER: CPU FileSystem Network
  • 120. SYNC READ AND DELIVER: CPU FileSystem Network ASYNC READ AND DELIVER:
  • 121. NODE DOC CIT. users of Node are free from worries of dead-locking the process there are no locks.Almost no function in Node directly performs I/O, so the process never blocks. Because nothing blocks, less-than-expert programmers are able to develop fast systems. [...] Node simply enters the event loop after executing the input script. Node exits the event loop when there are no more callbacks to perform.This behavior is like browser javascript the event loop is hidden from the user. https://github.com/joyent/libuv/blob/master/src/unix/threadpool.c#L32
  • 122. var  server  =  require('./lib/node-­‐router').getServer(); server.get("/json",  func@on  (req,  res,  match)  {    return  {hello:  "World"}; }); server.post(new  RegExp("^/(.*)$"),  func@on  hello(req,  res,  match)  {    return  "Hello  "  +  (match  ||  "World")  +  "!"; }); server.listen(8080); REST API sfruttando una semplice libreria siamo subito piu’ comodi
  • 124. PRIMA:
  • 125. PRIMA: Server dedicati o server condivisi
  • 126. PRIMA: Server dedicati o server condivisi POI:
  • 127. PRIMA: Server dedicati o server condivisi POI: I server vengono virtualizzati: leVPS
  • 129. ARRIVA LA CLOUD: PaaS: Platform as a Service
  • 130. ARRIVA LA CLOUD: PaaS: Platform as a Service le nostre aplicazioni girano in contenitori virtuali
  • 131. ARRIVA LA CLOUD: PaaS: Platform as a Service le nostre aplicazioni girano in contenitori virtuali i contenitori vengono replicati regionalmente
  • 132. ARRIVA LA CLOUD: PaaS: Platform as a Service le nostre aplicazioni girano in contenitori virtuali i contenitori vengono replicati regionalmente anche leVPS imparano questi nuovi “trucchi “
  • 134. VANTAGGI: e’ decisamente piu’ semplice scalare globalmente
  • 135. VANTAGGI: e’ decisamente piu’ semplice scalare globalmente non dobbiamo piu’ gestire l’infrastruttura
  • 136. VANTAGGI: e’ decisamente piu’ semplice scalare globalmente non dobbiamo piu’ gestire l’infrastruttura pay per use
  • 137. VANTAGGI: e’ decisamente piu’ semplice scalare globalmente non dobbiamo piu’ gestire l’infrastruttura pay per use aumentiamo o diminuiamo le nostre istanze con un click
  • 138. VANTAGGI: e’ decisamente piu’ semplice scalare globalmente non dobbiamo piu’ gestire l’infrastruttura pay per use aumentiamo o diminuiamo le nostre istanze con un click Il deploy si risolve con un git push!
  • 140. MA... il nostro stack diventa “blando”
  • 141. MA... il nostro stack diventa “blando” impatto piu’ evidente: le sessions
  • 142. MA... il nostro stack diventa “blando” impatto piu’ evidente: le sessions soluzioni come memcache o session-on-db si rivelano spesso “corte” e costose
  • 143. MA... il nostro stack diventa “blando” impatto piu’ evidente: le sessions soluzioni come memcache o session-on-db si rivelano spesso “corte” e costose soluzione: data driven single page application
  • 144. MA... il nostro stack diventa “blando” impatto piu’ evidente: le sessions soluzioni come memcache o session-on-db si rivelano spesso “corte” e costose soluzione: data driven single page application possiamo mutare il backend in web API! meglio se real time* *E chi e’ bravo nel real time? :)
  • 145. MA... il nostro stack diventa “blando” impatto piu’ evidente: le sessions soluzioni come memcache o session-on-db si rivelano spesso “corte” e costose soluzione: data driven single page application possiamo mutare il backend in web API! meglio se real time* *E chi e’ bravo nel real time? :) sfruttiamo a pieno la OOP: piu’ siamo puliti piu’ vantaggi.
  • 146. MA... il nostro stack diventa “blando” impatto piu’ evidente: le sessions soluzioni come memcache o session-on-db si rivelano spesso “corte” e costose soluzione: data driven single page application possiamo mutare il backend in web API! meglio se real time* *E chi e’ bravo nel real time? :) sfruttiamo a pieno la OOP: piu’ siamo puliti piu’ vantaggi. oggetti piccoli e specializzati risultano piu’ facili da distribuire
  • 147. MA... il nostro stack diventa “blando” impatto piu’ evidente: le sessions soluzioni come memcache o session-on-db si rivelano spesso “corte” e costose soluzione: data driven single page application possiamo mutare il backend in web API! meglio se real time* *E chi e’ bravo nel real time? :) sfruttiamo a pieno la OOP: piu’ siamo puliti piu’ vantaggi. oggetti piccoli e specializzati risultano piu’ facili da distribuire con l’aiuto di bus e code distribuiamo i processi nei paas
  • 149. E NODE? beh, nodejs ci va a nozze!
  • 150. E NODE? beh, nodejs ci va a nozze! il modello single thread e’ perfetto per i Paas
  • 151. E NODE? beh, nodejs ci va a nozze! il modello single thread e’ perfetto per i Paas i moduli possono essere distruibuiti facilmente essendo ad eventi va in idle quando non lavora e costa meno
  • 152. E NODE? beh, nodejs ci va a nozze! il modello single thread e’ perfetto per i Paas i moduli possono essere distruibuiti facilmente essendo ad eventi va in idle quando non lavora e costa meno sfruttando l’async rispondiamo valocemente all’utente demandando elaborazioni successive o costose in callbacks, processi o istanze diverse distrubuendo meglio il carico
  • 153. User NODE NODE Client Web Engine Database Logging facility Mass storage (big slow disk) DB Disk ESEMPIO DI ARCHITETTURA In questo modo i logs non rallentano piu’ i processi critici
  • 154. backend server Mobile client NodeJs instances Mobile Client ESEMPIO: LINKEDIN Linkedin usa node.js come middleware layer tra il backend e le applicazioni mobile
  • 155. backend server Mobile client NodeJs instances Mobile Client ESEMPIO: LINKEDIN Linkedin usa node.js come middleware layer tra il backend e le applicazioni mobile
  • 156. backend server Mobile client NodeJs instances Mobile Client ESEMPIO: LINKEDIN Linkedin usa node.js come middleware layer tra il backend e le applicazioni mobile VANTAGGI:
  • 157. backend server Mobile client NodeJs instances Mobile Client ESEMPIO: LINKEDIN Linkedin usa node.js come middleware layer tra il backend e le applicazioni mobile VANTAGGI: migliori prestazioni: node si rivela 20x piu’ veloce di Rails
  • 158. backend server Mobile client NodeJs instances Mobile Client ESEMPIO: LINKEDIN Linkedin usa node.js come middleware layer tra il backend e le applicazioni mobile VANTAGGI: migliori prestazioni: node si rivela 20x piu’ veloce di Rails l’infrastruttura passa da 30 a 3 server lasciando sufficienti risorse per scalare di 10 volte il traffico!
  • 159. UN CASO COMPLESSO Il backend di SaveThe Mom e’ tutto in node.js e ne sfrutta pesantemente il modello asincrono con l’aiuto di bus e code
  • 160. ED ORA: UN PO’ DI SPAM :) HTTP://NODEJSCONF.IT
  • 161. ED ORA: UN PO’ DI SPAM :) HTTP://WEBDEBS.ORG