Introduzione a Node.js

  • 1,474 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,474
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
8
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. COSE CHE NON TI ASPETTI DA JAVASCRIPT: NODE.JS
  • 2. Chi siamoLuciano  Colosio  SA  &  Dev  @  Save  The  Mom@unlucioMichele  Capra  Dev  @  OrangeCode@piccoloaiutante
  • 3. Cosa vedremo oggiChe  cos’è  Node.JSDove  nasce ContesB  in  cui  usarloIl  mondo  asincronoDemo  Live Deploy  su  un  servizio  free  (Heroku)
  • 4. Che cos’è Node.JS Javascirpt  runBme  basato  su  V8 Event  Driven  I/O  server-­‐side
  • 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. Da dove nasce Costo  dell’  I/OL1-­‐cache 3  cicliL2-­‐cache 14  cicli RAM 250  cicli Disco 41x10^6  cicliNetwork 240x10^6  cicli
  • 7. Gestire le richieste Sincrono:  gesBsco  una  richiesta  alla  voltaContro: ogni richiesta può (e fa!) da tappo alle altre
  • 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. Gestire le richieste Un  Thread  nuovo  per  ogni  richiestaContro:  la  macchina  potrebbe  non  avere  abbastanza  thread  disponibili,  programmazione  concorrente  è  complessa,  problemi  di  memoria
  • 10. Gestire le richieste La  scelta  di  node: Singolo  Thread Niente  parallelizzazione  del  codice
  • 11. Event LoopLa  logica  nell’eventloop  risulta  bloccante: Devo  aUendere  che  i  task  terminino
  • 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. 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. 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. 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. 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. Esempio di contesti Web APIRealtime web services (chat, push, peppertweet)
  • 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. JS: V8 in NodeStesso motore del browser ma:tutto gira nell’Event Loopnon c’è DOMnon c’è JQuery che tengaprogrammazione asincrona
  • 20. ESEMPI DI APPSMenamo  le  mani  in   pasta  :)
  • 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. 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. App Esempio Vi  ricordate  IRC? NO?!?!?! Ok,  ce  l’aspeUavamo  ;POggi  ci  ispireremo  al  passato  per  un  twiUer  bot: TWITVIA
  • 24. App Esempio Get  the  code:hUps://github.com/unlucio/tvitvia
  • 25. App Esempio: Struttura ModuliHeroku  Process DescriUore File  (opBonal) per  npm Main  File
  • 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. App Esempio Ovviamente  possiamo aggiungere  directory a  nostro  piacimento per  parB  delle  nostra  app
  • 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. 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. 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. 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. 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. 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. 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. Nella realta’Un  esempio  famoso  ed  eclatante   di  uBlizzo  di  node: Linkedin!
  • 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. 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. Grazie per l’attenzionese  volete,  trollateci  su  twiUer@unlucio  -­‐  @piccoloaiutante
  • 39. Un po’ di spam ;)hUp://nodejsconf.ithUp://www.webdebs.org/
  • 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