Introduzione a Node.js
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Introduzione a Node.js

  • 2,048 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
2,048
On Slideshare
1,796
From Embeds
252
Number of Embeds
4

Actions

Shares
Downloads
8
Comments
0
Likes
1

Embeds 252

http://www.orangecode.it 248
http://www.linkedin.com 2
http://webcache.googleusercontent.com 1
https://twitter.com 1

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