COSE CHE NON TI ASPETTI DA   JAVASCRIPT: NODE.JS
Chi siamoLuciano  Colosio  SA  &  Dev  @  Save  The  Mom@unlucioMichele  Capra  Dev  @  OrangeCode@piccoloaiutante
Cosa vedremo oggiChe  cos’è  Node.JSDove  nasce ContesB  in  cui  usarloIl  mondo  asincronoDemo  Live  Deploy  su  un  se...
Che cos’è Node.JS Javascirpt  runBme  basato  su  V8  Event  Driven  I/O  server-­‐side
Da dove nasce  Riprodurre  il  comportamento  in  “push”  mostrato  da  gmail                  Superare  i  limit  del  on...
Da dove nasce             Costo  dell’  I/OL1-­‐cache                         3  cicliL2-­‐cache                        14...
Gestire le richieste        Sincrono:  gesBsco  una  richiesta  alla  voltaContro: ogni richiesta può (e fa!) da tappo all...
Gestire le richieste                Fork  del  processo    Un  processo  nuovo  per  ogni  richiestaContro:  non  scala  s...
Gestire le richieste     Un  Thread  nuovo  per  ogni  richiestaContro:  la  macchina  potrebbe  non  avere  abbastanza  t...
Gestire le richieste          La  scelta  di  node:           Singolo  Thread Niente  parallelizzazione  del  codice
Event LoopLa  logica  nell’eventloop  risulta  bloccante:  Devo  aUendere  che  i  task  terminino
Soluzione:  NON fare nulla nel maintheradTutte le chiamate di I/O sono gestite come eventi asincroni, quindi non          ...
Event loop  non e necessario pre carrozzarsi per le               perfomarnces(es: pre allocare thread per rispondere piu ...
Importante!Rispondere velocemente al client delegando a taskattività che richiedono risorse ed i/o ad alta latenza      Il...
Async VS Sync//  Good:  write  files  asynchronouslyfs.writeFile(message.txt,  Hello  Node,  funcBon  (err)  {    console.l...
Esempio Architettura                              Database    Client     Web Engine        DB    User        NODE         ...
Esempio di contesti                   Web APIRealtime web services (chat, push, peppertweet)
Chi lo usa:                  37signals            Ajax.org - Cloud9 IDE                    eBay                   Trello  ...
JS: V8 in NodeStesso motore del browser ma:tutto gira nell’Event Loopnon c’è DOMnon c’è JQuery che tengaprogrammazione asi...
ESEMPI DI APPSMenamo  le  mani  in      pasta  :)
App Esempio       HUp  Hello  World,  la  piu’  semplice  node  app:var http = require(http);var server = http.createServe...
App EsempioHttp Hello World, basta una lib ed ecco un servizio                      RESTvar  server  =  require(./lib/node...
App Esempio                  Vi  ricordate  IRC?                      NO?!?!?!              Ok,  ce  l’aspeUavamo  ;POggi ...
App Esempio        Get  the  code:hUps://github.com/unlucio/tvitvia
App Esempio: Struttura                    ModuliHeroku  Process                 DescriUore File  (opBonal)                ...
App Esempio: npm install     Moduli  installaB                           {                                "name":  "Twitvi...
App Esempio      Ovviamente  possiamo       aggiungere  directory       a  nostro  piacimento     per  parB  delle  nostra...
App Esempio: def. lib   var  Twit  =  require(twit);   module.exports  =  (funcBon(twiUerClient)  {           twiUerClient...
App Esempio: use lib   var  TweUerClient  =  require(./lib/twiUerClient),   var  tClient  =  new  TweUerClient({         c...
App Esempio: model objs     var  _  =  require(underscore);     module.exports  =  (funcBon(quesBons)  {                  ...
App Esempio: model objs     module.exports  =  (funcBon(answers)  {                answers  =  funcBon(db,  tweeterClient)...
App Esempio: model objs    module.exports  =  (funcBon(users)  {                users  =  funcBon(db,  tweeterClient)  {  ...
App Esempio: together         var  mysql  =  require(db-­‐mysql),               TweUerClient  =  require(./lib/twiUerClien...
Deploy & hosting            heroku  login      Compiliamo  il  Procfile  web:  node  <mainscript.js>               git  ini...
Nella realta’Un  esempio  famoso  ed  eclatante         di  uBlizzo  di  node:          Linkedin!
Dove lo usano?Linkedin  usa  node  come  middle  layer  tra  i  server  di  backend  ed  i                             cli...
I 10 consigli per node.jsEvitare  il  codice  sincoronoNo  socket  polling!Non  usare  node.js  per  servire  asset  staBc...
Grazie per l’attenzionese  volete,  trollateci  su  twiUer@unlucio  -­‐  @piccoloaiutante
Un po’ di spam ;)hUp://nodejsconf.ithUp://www.webdebs.org/
Cerco DevSave the Mom cerca sviluppatori da integrare nel                 nostro team! :)                      Skills:    ...
Upcoming SlideShare
Loading in...5
×

Introduzione a Node.js

1,594

Published on

Lezione tenuta presso la Facoltà di Ingegneria dell'Università degli Studi di Brescia

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,594
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Introduzione a Node.js

  1. 1. COSE CHE NON TI ASPETTI DA JAVASCRIPT: NODE.JS
  2. 2. Chi siamoLuciano  Colosio  SA  &  Dev  @  Save  The  Mom@unlucioMichele  Capra  Dev  @  OrangeCode@piccoloaiutante
  3. 3. Cosa vedremo oggiChe  cos’è  Node.JSDove  nasce ContesB  in  cui  usarloIl  mondo  asincronoDemo  Live Deploy  su  un  servizio  free  (Heroku)
  4. 4. Che cos’è Node.JS Javascirpt  runBme  basato  su  V8 Event  Driven  I/O  server-­‐side
  5. 5. Da dove nasce Riprodurre  il  comportamento  in  “push”  mostrato  da  gmail Superare  i  limit  del  one-­‐way   BONUS DERIVATOLe  caraUerisBche  asincrone  di  JS  permeUono  una  gesBone  piu’   comoda  dell’I/O  che  costa  molto
  6. 6. Da dove nasce Costo  dell’  I/OL1-­‐cache 3  cicliL2-­‐cache 14  cicli RAM 250  cicli Disco 41x10^6  cicliNetwork 240x10^6  cicli
  7. 7. Gestire le richieste Sincrono:  gesBsco  una  richiesta  alla  voltaContro: ogni richiesta può (e fa!) da tappo alle altre
  8. 8. Gestire le richieste Fork  del  processo Un  processo  nuovo  per  ogni  richiestaContro:  non  scala  su  migliaia  di  connessioni (ameno  di  non  usare  migliaia  di  servers  ;))
  9. 9. Gestire le richieste Un  Thread  nuovo  per  ogni  richiestaContro:  la  macchina  potrebbe  non  avere  abbastanza  thread  disponibili,  programmazione  concorrente  è  complessa,  problemi  di  memoria
  10. 10. Gestire le richieste La  scelta  di  node: Singolo  Thread Niente  parallelizzazione  del  codice
  11. 11. Event LoopLa  logica  nell’eventloop  risulta  bloccante: Devo  aUendere  che  i  task  terminino
  12. 12. Soluzione: NON fare nulla nel maintheradTutte le chiamate di I/O sono gestite come eventi asincroni, quindi non bloccanti.Utilizzare event driven development
  13. 13. Event loop non e necessario pre carrozzarsi per le perfomarnces(es: pre allocare thread per rispondere piu velocemente). Minor spreco di memoria/risorseMinor rischio che il server vada in oveload
  14. 14. Importante!Rispondere velocemente al client delegando a taskattività che richiedono risorse ed i/o ad alta latenza Il focus è sulla risposta nel minor tempo possibile
  15. 15. Async VS Sync//  Good:  write  files  asynchronouslyfs.writeFile(message.txt,  Hello  Node,  funcBon  (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!");
  16. 16. Esempio Architettura Database Client Web Engine DB User NODE NODE Disk Mass storage Logging facility (big slow disk)Le scritture dei logs non sono piu’ un problema!
  17. 17. Esempio di contesti Web APIRealtime web services (chat, push, peppertweet)
  18. 18. Chi lo usa: 37signals Ajax.org - Cloud9 IDE eBay Trello Klout Linkedin Microsoft Voxer Yahoo!https://github.com/joyent/node/wiki/Projects,- Applications,-and-Companies-Using-Node
  19. 19. JS: V8 in NodeStesso motore del browser ma:tutto gira nell’Event Loopnon c’è DOMnon c’è JQuery che tengaprogrammazione asincrona
  20. 20. ESEMPI DI APPSMenamo  le  mani  in   pasta  :)
  21. 21. App Esempio HUp  Hello  World,  la  piu’  semplice  node  app: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/");
  22. 22. App EsempioHttp Hello World, basta una lib ed ecco un servizio RESTvar  server  =  require(./lib/node-­‐router).getServer();server.get("/json",  funcBon  (req,  res,  match)  {    return  {hello:  "World"};});server.get(new  RegExp("^/(.*)$"),  funcBon  hello(req,  res,  match)  {    return  "Hello  "  +  (match  ||  "World")  +  "!";});server.listen(8080);
  23. 23. App Esempio Vi  ricordate  IRC? NO?!?!?! Ok,  ce  l’aspeUavamo  ;POggi  ci  ispireremo  al  passato  per  un  twiUer  bot: TWITVIA
  24. 24. App Esempio Get  the  code:hUps://github.com/unlucio/tvitvia
  25. 25. App Esempio: Struttura ModuliHeroku  Process DescriUore File  (opBonal) per  npm Main  File
  26. 26. App Esempio: npm install Moduli  installaB {   "name":  "Twitvia",   "descripBon":  "Vintage  trivia  bot",   "version":  "0.0.1",   "dependencies":  {     "twit"  :  "0.1.2",     "underscore":  "1.3.1",     "db-­‐mysql":  "0.7.6"   },   "engines":  {     "node":  ">=  0.6.0"   }Diamogli  un  nome  sensato  :)
  27. 27. App Esempio Ovviamente  possiamo aggiungere  directory a  nostro  piacimento per  parB  delle  nostra  app
  28. 28. App Esempio: def. lib var  Twit  =  require(twit); module.exports  =  (funcBon(twiUerClient)  {     twiUerClient  =  funcBon(datas)  {};     twiUerClient.prototype.publishTweet  =  funcBon  (message)  {};   twiUerClient.prototype.sendMenBon  =  funcBon  (to,  message)  {};   twiUerClient.prototype.sendDM  =  funcBon  (to,  message)  {};     twiUerClient.prototype.followUser  =  funcBon  (user)  {};     return  twiUerClient; })();
  29. 29. App Esempio: use lib var  TweUerClient  =  require(./lib/twiUerClient), var  tClient  =  new  TweUerClient({   consumer_key:                  getItFromTwiUer,   consumer_secret:            getItFromTwiUer,   access_token:                  getItFromTwiUer,   access_token_secret:    getItFromTwiUer, }); funcBon  getCommand(tweet)  { [...] } tClient.T.stream(user,[],  funcBon  (stream)  {    stream.on(tweet,  funcBon  (tweet)  {   getCommand(tweet)    }); });
  30. 30. App Esempio: model objs var  _  =  require(underscore); module.exports  =  (funcBon(quesBons)  {     quesBons  =  funcBon(db,  tweeterClient)  {     this.db  =  db;     this.tweeterClient  =  tweeterClient;   };     quesBons.prototype.publishRandom  =  funcBon()  {};     quesBons.prototype.getRandom  =  funcBon  (quesBonsList)  {};     quesBons.prototype.selectAll  =  funcBon(callback)  {};     quesBons.prototype.setAnswered  =  funcBon(refTweetID,   callback)  {}     return  quesBons; })();
  31. 31. App Esempio: model objs module.exports  =  (funcBon(answers)  {     answers  =  funcBon(db,  tweeterClient)  {     this.db  =  db;     this.tweeterClient  =  tweeterClient;   };     answers.prototype.checkMatch  =    funcBon  (refTweetID,   userAnswer,  callback)  {   };   return  answers; })();
  32. 32. App Esempio: model objs module.exports  =  (funcBon(users)  {     users  =  funcBon(db,  tweeterClient)  {     this.db  =  db;     this.tweeterClient  =  tweeterClient;   };     users.prototype.find  =  funcBon(userName,  callback)  {};     users.prototype.add  =  funcBon(userName,  callback)  {};     users.prototype.capture  =  funcBon(userName,  callback)  {};     users.prototype.scorePoint  =  funcBon(userName,  callback)  {};     users.prototype._updateScore  =  funcBon(userID,  thePlayer,  callback){};     return  users; })();
  33. 33. App Esempio: together var  mysql  =  require(db-­‐mysql),   TweUerClient  =  require(./lib/twiUerClient),   Users  =  require(./model/users),   QuesBons  =  require(./model/quesBons),   Answers  =  require(./model/answers); var  myDb  =  new  mysql.Database({ [connecBon  datas] }); [...] var  tClient  =  new  TweUerClient({ [api  datas] }); var  users  =  new  Users(myDb,  tClient); var  quesBons  =  new  QuesBons(myDb,  tClient); var  answers  =  new  Answers(myDb,  tClient); tClient.T.stream(user,[],  funcBon  (stream)  {    stream.on(tweet,  funcBon  (tweet)  {   getCommand(tweet)    }); });
  34. 34. Deploy & hosting heroku  login Compiliamo  il  Procfile web:  node  <mainscript.js> git  init git  add  .git  commit  -­‐m  “<commento>” heroku  create  -­‐-­‐stack  cedar git  push  heroku  master heroku  ps:scale  web=1
  35. 35. Nella realta’Un  esempio  famoso  ed  eclatante   di  uBlizzo  di  node: Linkedin!
  36. 36. Dove lo usano?Linkedin  usa  node  come  middle  layer  tra  i  server  di  backend  ed  i   client  mobile Mobile client NodeJs backend instances server Mobile Client
  37. 37. I 10 consigli per node.jsEvitare  il  codice  sincoronoNo  socket  polling!Non  usare  node.js  per  servire  asset  staBciDelegare  il  rendering  al  clientUsare  gzip  tra  i  vari  componenBParallelizzare  al  piu’  possibile!Se  possibile:  NO  SESSIONSUsare  moduli  binari  anzicche’  in  javascriptUsare  javascript  standard  anzicche’  librerie  faUe  per  i  clientTenere  il  codice  piccolo  e  compaUo
  38. 38. Grazie per l’attenzionese  volete,  trollateci  su  twiUer@unlucio  -­‐  @piccoloaiutante
  39. 39. Un po’ di spam ;)hUp://nodejsconf.ithUp://www.webdebs.org/
  40. 40. Cerco DevSave the Mom cerca sviluppatori da integrare nel nostro team! :) Skills: Web MobileWeb Mobile applications (iOS, wp7, android, balckberry) Scrivi  a:lucio@savethemom.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×