Node and the Cloud

707 views

Published on

Slides da un seminario tenuto a maggio 2012.
Universita' di milano, sede di Crema - Dipartimento di informatica.

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
707
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Node and the Cloud

  1. 1. Benvenuti
  2. 2. Luciano Colosio@unlucioCTO @ SaveTheMom Inc.Federico Gandellini@gandellinuxFreelance Developer
  3. 3. INDEX• Node.js: la storia• Node.js distilled: SyncVS Async• Clouding• Uso di node come Backend API
  4. 4. Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable networkapplications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight andefficient, perfect for data-intensive real-time applications that run across distributed devices.CurrentVersion: v0.8.21
  5. 5. RYAN DAHLnode.js creatoranno: 2009
  6. 6. RYAN DAHLStudente in MatematicaSi trasferisce in Sud AmericaIncontra un programmatore phpInizia a sviluppare siti ed “applicazioni” webIncontra RORSi accorge che il Web e’ lento!
  7. 7. Il Web e’ lento!Per via di Java ;)
  8. 8. Il Web e’ lento!Alcuni cominciano a lavorare per velocizzare ROR
  9. 9. Il Web e’ lento!Alcuni cominciano a lavorare per velocizzare RORMa il problema risiede nell’intero stack
  10. 10. Il Web e’ lento!Alcuni cominciano a lavorare per velocizzare RORMa il problema risiede nell’intero stackIl lavoro di Zed Shaw da vita a Mongrel
  11. 11. Mongrel
  12. 12. MongrelE’ sia una libreria http, sia un webserver!
  13. 13. MongrelE’ sia una libreria http, sia un webserver!Il web server non e’ piu’ solo “una directory “
  14. 14. MongrelE’ sia una libreria http, sia un webserver!Il web server non e’ piu’ solo “una directory “Puo’ racchiudere direttamente la logica
  15. 15. Il Web Server
  16. 16. Il Web ServerDistillato, e’ fatto per gestire richieste e risposte
  17. 17. Il Web ServerDistillato, e’ fatto per gestire richieste e risposteServire files e’ una parte ma non e’ obbligatoria
  18. 18. THE FILE UPLOAD PROBLEM
  19. 19. THE FILE UPLOAD PROBLEMCaricare files via http non era poi cosi’ comune
  20. 20. THE FILE UPLOAD PROBLEMCaricare files via http non era poi cosi’ comuneCon la nascita di Ajax si cominciavano a caricareVIDEO!
  21. 21. THE FILE UPLOAD PROBLEMCaricare files via http non era poi cosi’ comuneCon la nascita di Ajax si cominciavano a caricareVIDEO!Ed ecco un nuovo problema da affrontare:
  22. 22. LA PROGRESS BAR
  23. 23. LA PROGRESS BARIl DOM non dava alcuna informazione sul file
  24. 24. LA PROGRESS BARIl DOM non dava alcuna informazione sul fileIl trucco era controllare lo stato del file lato server in batch.
  25. 25. LA PROGRESS BARIl DOM non dava alcuna informazione sul fileIl trucco era controllare lo stato del file lato server in batch.Ma l’http 1.1 ci da connessioni che possono restare aperte!
  26. 26. LA PROGRESS BARIl DOM non dava alcuna informazione sul fileIl 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
  27. 27. IL LONG POLLING
  28. 28. IL LONG POLLINGNon piu’ continue richieste Ajax temporizzate
  29. 29. IL LONG POLLINGNon piu’ continue richieste Ajax temporizzateIl Web Server risponde e non chiude subito la connessione
  30. 30. IL LONG POLLINGNon piu’ continue richieste Ajax temporizzateIl Web Server risponde e non chiude subito la connessioneLa connessione resta aperta finche’ la si puo’ usare
  31. 31. IL LONG POLLINGNon piu’ continue richieste Ajax temporizzateIl Web Server risponde e non chiude subito la connessioneLa connessione resta aperta finche’ la si puo’ usareIl Server continua a spedire lo stato del file fino al termine
  32. 32. IL WEB SERVER E’APPENADIVENTATO MOLTO PIU’INTELLIGENTE! :)
  33. 33. MA...
  34. 34. IL WEB E’ANCORA LENTO!
  35. 35. IL WEB E’ANCORA LENTO!Ruby, Python, ecc sono troppo lenti by design
  36. 36. IL WEB E’ANCORA LENTO!Ruby, Python, ecc sono troppo lenti by designGli interpreti sono singoli thread bloccanti
  37. 37. IL WEB E’ANCORA LENTO!Ruby, Python, ecc sono troppo lenti by designGli interpreti sono singoli thread bloccantiIl C e’ veloce ma uno sconosciuto per troppi webdev
  38. 38. SI SPERIMENTA CON:
  39. 39. SI SPERIMENTA CON:Ruby
  40. 40. SI SPERIMENTA CON:RubyPython
  41. 41. SI SPERIMENTA CON:RubyPythonAskel
  42. 42. L’OBIETTIVO:
  43. 43. L’OBIETTIVO:Costruire un sistema libero da lock!
  44. 44. LA RISPOSTA:
  45. 45. LA RISPOSTA:Tutto in un solo thread
  46. 46. LA RISPOSTA:Tutto in un solo threadMigliora?
  47. 47. LA RISPOSTA:Tutto in un solo threadMigliora?SI! Si possono evitare tutti i problemi derivanti dai lock!
  48. 48. LA RISPOSTA:Tutto in un solo threadMigliora?SI! Si possono evitare tutti i problemi derivanti dai lock!C’e’ un linguaggio che tutto cio’ lo fa di natura:
  49. 49. JAVASCRIPT
  50. 50. JAVASCRIPTNegli ultimi anni ha preso sempre piu’ piede
  51. 51. JAVASCRIPTNegli ultimi anni ha preso sempre piu’ piedeTutti i maggiori browser stavano gia’ “combattendo su js”
  52. 52. JAVASCRIPTNegli ultimi anni ha preso sempre piu’ piedeTutti i maggiori browser stavano gia’ “combattendo su js”Nel 2008 era stato rilasciatoV8
  53. 53. JAVASCRIPTNegli ultimi anni ha preso sempre piu’ piedeTutti i maggiori browser stavano gia’ “combattendo su js”Nel 2008 era stato rilasciatoV8Ha le caratteristiche adatte:
  54. 54. JAVASCRIPTNegli ultimi anni ha preso sempre piu’ piedeTutti i maggiori browser stavano gia’ “combattendo su js”Nel 2008 era stato rilasciatoV8Ha le caratteristiche adatte:Closures
  55. 55. JAVASCRIPTNegli ultimi anni ha preso sempre piu’ piedeTutti i maggiori browser stavano gia’ “combattendo su js”Nel 2008 era stato rilasciatoV8Ha le caratteristiche adatte:ClosuresFunzioni anonime
  56. 56. JAVASCRIPTNegli ultimi anni ha preso sempre piu’ piedeTutti i maggiori browser stavano gia’ “combattendo su js”Nel 2008 era stato rilasciatoV8Ha le caratteristiche adatte:ClosuresFunzioni anonimeNon e’ usato al di fuori dei browser
  57. 57. JAVASCRIPTNegli ultimi anni ha preso sempre piu’ piedeTutti i maggiori browser stavano gia’ “combattendo su js”Nel 2008 era stato rilasciatoV8Ha le caratteristiche adatte:ClosuresFunzioni anonimeNon e’ usato al di fuori dei browserQuindi non ha preconcetti su come fare le cose.
  58. 58. NASCE NODE.JS
  59. 59. NASCE NODE.JSViene presentato alla javascript conf di Berlino
  60. 60. NASCE NODE.JSViene presentato alla javascript conf di BerlinoLa prima app di demo: un IRC Server, 400 linee di codice!
  61. 61. NASCE NODE.JSViene presentato alla javascript conf di BerlinoLa prima app di demo: un IRC Server, 400 linee di codice!Ed e’ fatto per costruire network servers!
  62. 62. NASCE NODE.JSViene presentato alla javascript conf di BerlinoLa 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
  63. 63. NASCE NODE.JSViene presentato alla javascript conf di BerlinoLa 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 moltiE’ adatto alla Cloud* per sua natura.*Una volta si chiamava internet
  64. 64. MA...
  65. 65. È:JAVASCRIPTNELSERVER!
  66. 66. È:JAVASCRIPTNELSERVER!
  67. 67. È:JAVASCRIPTNELSERVER!
  68. 68. JAVASCRIPT
  69. 69. JAVASCRIPT[]+[] =
  70. 70. JAVASCRIPT[]+[] = ‘’
  71. 71. JAVASCRIPT[]+[] = ‘’[]+{} =
  72. 72. JAVASCRIPT[]+[] = ‘’[]+{} = [object Object]
  73. 73. JAVASCRIPT[]+[] = ‘’[]+{} = [object Object]{}+[] =
  74. 74. JAVASCRIPT[]+[] = ‘’[]+{} = [object Object]{}+[] = 0
  75. 75. JAVASCRIPT[]+[] = ‘’[]+{} = [object Object]{}+[] = 0{}+{} =
  76. 76. JAVASCRIPT[]+[] = ‘’[]+{} = [object Object]{}+[] = 0{}+{} = NaN
  77. 77. JAVASCRIPT[]+[] = ‘’[]+{} = [object Object]{}+[] = 0{}+{} = NaN‘’-1 =
  78. 78. JAVASCRIPT[]+[] = ‘’[]+{} = [object Object]{}+[] = 0{}+{} = NaN‘’-1 = -1
  79. 79. JAVASCRIPT[]+[] = ‘’[]+{} = [object Object]{}+[] = 0{}+{} = NaN‘’-1 = -1‘string’-1 =
  80. 80. JAVASCRIPT[]+[] = ‘’[]+{} = [object Object]{}+[] = 0{}+{} = NaN‘’-1 = -1‘string’-1 = NaN
  81. 81. PARLIAMONE...
  82. 82. SPEED:
  83. 83. SPEED:“Javascript e’ lento”
  84. 84. SPEED:“Javascript e’ lento”sbagliato, e’ la DOM API ad essere lenta!
  85. 85. SPEED:“Javascript e’ lento”sbagliato, e’ la DOM API ad essere lenta!“Per essere non-blocking non bisogna fare I/O”
  86. 86. 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!
  87. 87. 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”
  88. 88. 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:
  89. 89. credits: Daniel Clifford, Manager andTech LeadV8Team. (@Google I/O 2012)
  90. 90. ALTRO:
  91. 91. ALTRO:“Necessita del proprio HTTP server interno”
  92. 92. ALTRO:“Necessita del proprio HTTP server interno”questo in realta’ e’ uno dei punti di forza di nodeed uno dei motivi per cui nasce
  93. 93. ALTRO:“Necessita del proprio HTTP server interno”questo in realta’ e’ uno dei punti di forza di nodeed uno dei motivi per cui nasce“Necessita di cache/reverse proxy”
  94. 94. ALTRO:“Necessita del proprio HTTP server interno”questo in realta’ e’ uno dei punti di forza di nodeed uno dei motivi per cui nasce“Necessita di cache/reverse proxy”Nessuno al giorno d’oggi in produzione usa webserverdirettamente connessi ad internet,i layer di apparati e logica sono ingenti
  95. 95. ALTRO:“Necessita del proprio HTTP server interno”questo in realta’ e’ uno dei punti di forza di nodeed uno dei motivi per cui nasce“Necessita di cache/reverse proxy”Nessuno al giorno d’oggi in produzione usa webserverdirettamente connessi ad internet,i layer di apparati e logica sono ingenti“Consuma molte risorse”
  96. 96. ALTRO:“Necessita del proprio HTTP server interno”questo in realta’ e’ uno dei punti di forza di nodeed uno dei motivi per cui nasce“Necessita di cache/reverse proxy”Nessuno al giorno d’oggi in produzione usa webserverdirettamente connessi ad internet,i layer di apparati e logica sono ingenti“Consuma molte risorse”Le esperienze pratiche dimostrano ben altro, conperformaces impressionanti (rif: linkedin)
  97. 97. EBBENE SI’, SIAMO DEGLIIDIOTI E LO USIAMOSERIAMENTE! ;)
  98. 98. 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
  99. 99. ASYNC E NEXTTICK
  100. 100. ASYNC E NEXTTICKIl nostro codice javascript gira in un solo thread
  101. 101. ASYNC E NEXTTICKIl nostro codice javascript gira in un solo threadNode utilizza poi un thread-pool per gestire l’I/O
  102. 102. ASYNC E NEXTTICKOgni thread ha una coda di task ad eseguireIl nostro codice javascript gira in un solo threadNode utilizza poi un thread-pool per gestire l’I/O
  103. 103. ASYNC E NEXTTICKOgni thread ha una coda di task ad eseguireIl nostro codice javascript gira in un solo threadNode utilizza poi un thread-pool per gestire l’I/OAd ogniTick viene consumato un task nella coda
  104. 104. ASYNC E NEXTTICKOgni thread ha una coda di task ad eseguireIl nostro codice javascript gira in un solo threadNode utilizza poi un thread-pool per gestire l’I/OAd ogniTick viene consumato un task nella codaNon dobbiamo curarci di problemi di concorrenza
  105. 105. //  Good:  write  files  asynchronouslyfs.writeFile(message.txt,  Hello  Node,  func@on  (err)  {    console.log("Its  saved  and  the  server  remains  responsive!");});//  BAD:  write  files  synchronouslyfs.writeFileSync(message.txt,  Hello  Node);console.log("Its  saved,  but  you  just  blocked  ALL  requests!");ASYNC VS SYNC
  106. 106. 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
  107. 107. 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
  108. 108. 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
  109. 109. 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
  110. 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. 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. 112. 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
  113. 113. 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
  114. 114. 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
  115. 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. 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. 117. SYNC READ AND DELIVER:CPU FileSystem NetworkASYNC READ AND DELIVER:
  118. 118. NODE DOC CIT.users of Node are free from worries of dead-locking theprocess there are no locks.Almost no function in Nodedirectly performs I/O, so the process never blocks. Becausenothing blocks, less-than-expert programmers are able todevelop fast systems.[...]Node simply enters the event loop after executing the inputscript. Node exits the event loop when there are no morecallbacks to perform.This behavior is like browser javascriptthe event loop is hidden from the user.https://github.com/joyent/libuv/blob/master/src/unix/threadpool.c#L32
  119. 119. 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 APIsfruttando una semplice libreria siamo subito piu’ comodi
  120. 120. InternetThe Cloud!
  121. 121. PRIMA:
  122. 122. PRIMA:Server dedicati o server condivisi
  123. 123. PRIMA:Server dedicati o server condivisiPOI:
  124. 124. PRIMA:Server dedicati o server condivisiPOI:I server vengono virtualizzati: leVPS
  125. 125. ARRIVA LA CLOUD:
  126. 126. ARRIVA LA CLOUD:PaaS: Platform as a Service
  127. 127. ARRIVA LA CLOUD:PaaS: Platform as a Servicele nostre aplicazioni girano in contenitori virtuali
  128. 128. ARRIVA LA CLOUD:PaaS: Platform as a Servicele nostre aplicazioni girano in contenitori virtualii contenitori vengono replicati regionalmente
  129. 129. ARRIVA LA CLOUD:PaaS: Platform as a Servicele nostre aplicazioni girano in contenitori virtualii contenitori vengono replicati regionalmenteanche leVPS imparano questi nuovi “trucchi “
  130. 130. VANTAGGI:
  131. 131. VANTAGGI:e’ decisamente piu’ semplice scalare globalmente
  132. 132. VANTAGGI:e’ decisamente piu’ semplice scalare globalmentenon dobbiamo piu’ gestire l’infrastruttura
  133. 133. VANTAGGI:e’ decisamente piu’ semplice scalare globalmentenon dobbiamo piu’ gestire l’infrastrutturapay per use
  134. 134. VANTAGGI:e’ decisamente piu’ semplice scalare globalmentenon dobbiamo piu’ gestire l’infrastrutturapay per useaumentiamo o diminuiamo le nostre istanze con un click
  135. 135. VANTAGGI:e’ decisamente piu’ semplice scalare globalmentenon dobbiamo piu’ gestire l’infrastrutturapay per useaumentiamo o diminuiamo le nostre istanze con un clickIl deploy si risolve con un git push!
  136. 136. MA...*E te pareva...
  137. 137. MA...il nostro stack diventa “blando”
  138. 138. MA...il nostro stack diventa “blando”impatto piu’ evidente: le sessions
  139. 139. MA...il nostro stack diventa “blando”impatto piu’ evidente: le sessionssoluzioni come memcache o session-on-dbsi rivelano spesso “corte” e costose
  140. 140. MA...il nostro stack diventa “blando”impatto piu’ evidente: le sessionssoluzioni come memcache o session-on-dbsi rivelano spesso “corte” e costosesoluzione: data driven single page application
  141. 141. MA...il nostro stack diventa “blando”impatto piu’ evidente: le sessionssoluzioni come memcache o session-on-dbsi rivelano spesso “corte” e costosesoluzione: data driven single page applicationpossiamo mutare il backend in web API! meglio se real time**E chi e’ bravo nel real time? :)
  142. 142. MA...il nostro stack diventa “blando”impatto piu’ evidente: le sessionssoluzioni come memcache o session-on-dbsi rivelano spesso “corte” e costosesoluzione: data driven single page applicationpossiamo 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.
  143. 143. MA...il nostro stack diventa “blando”impatto piu’ evidente: le sessionssoluzioni come memcache o session-on-dbsi rivelano spesso “corte” e costosesoluzione: data driven single page applicationpossiamo 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
  144. 144. MA...il nostro stack diventa “blando”impatto piu’ evidente: le sessionssoluzioni come memcache o session-on-dbsi rivelano spesso “corte” e costosesoluzione: data driven single page applicationpossiamo 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 distribuirecon l’aiuto di bus e code distribuiamo i processi nei paas
  145. 145. E NODE?
  146. 146. E NODE?beh, nodejs ci va a nozze!
  147. 147. E NODE?beh, nodejs ci va a nozze!il modello single thread e’ perfetto per i Paas
  148. 148. E NODE?beh, nodejs ci va a nozze!il modello single thread e’ perfetto per i Paasi moduli possono essere distruibuiti facilmenteessendo ad eventi va in idle quando non lavora e costa meno
  149. 149. E NODE?beh, nodejs ci va a nozze!il modello single thread e’ perfetto per i Paasi moduli possono essere distruibuiti facilmenteessendo ad eventi va in idle quando non lavora e costa menosfruttando l’async rispondiamo valocemente all’utentedemandando elaborazioni successive o costose in callbacks,processi o istanze diverse distrubuendo meglio il carico
  150. 150. User NODENODEClient Web EngineDatabaseLogging facilityMass storage(big slow disk)DBDiskESEMPIO DI ARCHITETTURAIn questo modo i logs non rallentano piu’ i processi critici
  151. 151. backendserverMobile clientNodeJsinstancesMobile ClientESEMPIO: LINKEDINLinkedin usa node.js come middleware layer tra il backend e leapplicazioni mobile
  152. 152. backendserverMobile clientNodeJsinstancesMobile ClientESEMPIO: LINKEDINLinkedin usa node.js come middleware layer tra il backend e leapplicazioni mobile
  153. 153. backendserverMobile clientNodeJsinstancesMobile ClientESEMPIO: LINKEDINLinkedin usa node.js come middleware layer tra il backend e leapplicazioni mobileVANTAGGI:
  154. 154. backendserverMobile clientNodeJsinstancesMobile ClientESEMPIO: LINKEDINLinkedin usa node.js come middleware layer tra il backend e leapplicazioni mobileVANTAGGI:migliori prestazioni: node si rivela 20x piu’ veloce di Rails
  155. 155. backendserverMobile clientNodeJsinstancesMobile ClientESEMPIO: LINKEDINLinkedin usa node.js come middleware layer tra il backend e leapplicazioni mobileVANTAGGI:migliori prestazioni: node si rivela 20x piu’ veloce di Railsl’infrastruttura passa da 30 a 3 serverlasciando sufficienti risorse per scalare di 10 volte il traffico!
  156. 156. UN CASO COMPLESSOIl backend di SaveThe Mom e’ tutto in node.js e ne sfruttapesantemente il modello asincrono con l’aiuto di bus e code
  157. 157. ED ORA: UN PO’ DI SPAM :)HTTP://NODEJSCONF.IT
  158. 158. ED ORA: UN PO’ DI SPAM :)HTTP://WEBDEBS.ORG
  159. 159. TROLLATECI SUTWITTER!@UNLUCIO @GANDELLINUX
  160. 160. TROLLATECI SUTWITTER!@UNLUCIO @GANDELLINUX
  161. 161. Grazie :)

×