Introduzione a Node.js

  • View
    1.551

  • Download
    3

Embed Size (px)

DESCRIPTION

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

Text of Introduzione a Node.js

  • 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 LiveDeploy su un servizio free (Heroku) 4. Che cos Node.JS Javascirpt runBme basato su V8Event Driven I/O server-side 5. Da dove nasceRiprodurre il comportamento in push mostrato da gmailSuperare i limit del one-way BONUS DERIVATOLe caraUerisBche asincrone di JS permeUono una gesBone piu comoda dellI/O che costa molto 6. Da dove nasce Costo dell I/OL1-cache 3 cicliL2-cache14 cicliRAM250 cicli Disco41x10^6 cicliNetwork 240x10^6 cicli 7. Gestire le richiesteSincrono: gesBsco una richiesta alla voltaContro: ogni richiesta pu (e fa!) da tappo alle altre 8. Gestire le richiesteFork del processoUn 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 richiesteLa scelta di node: Singolo Thread Niente parallelizzazione del codice 11. Event LoopLa logica nelleventloop 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 loopnon 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 latenzaIl focus sulla risposta nel minor tempopossibile 15. Async VS Sync// Good: write les asynchronouslyfs.writeFile(message.txt, Hello Node, funcBon (err) { console.log("Its saved and the server remains responsive!");});// BAD: write les synchronouslyfs.writeFileSync(message.txt, Hello Node);console.log("Its saved, but you just blocked ALL requests!"); 16. Esempio ArchitetturaDatabaseClient Web EngineDBUserNODENODEDisk Mass storageLogging 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:37signalsAjax.org - Cloud9 IDEeBay TrelloKloutLinkedinMicrosoft 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 nellEvent 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 servizioRESTvar 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 EsempioVi ricordate IRC?NO?!?!?!Ok, ce laspeUavamo ;POggi ci ispireremo al passato per un twiUer bot: TWITVIA 24. App EsempioGet the code:hUps://github.com/unlucio/tvitvia 25. App Esempio: StrutturaModuliHeroku 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 EsempioOvviamente 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 objsmodule.exports = (funcBon(users) { users = funcBon(db, tweeterClient) { this.db = db; this.tweeterClient = tweeterClient; }; users.prototype.nd = 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 & hostingheroku loginCompiliamo il Procleweb: node git initgit add .git commit -m heroku create --stack cedar git push heroku master heroku ps:scale web=1 35. Nella realtaUn 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 mobileMobile client NodeJs backendinstancesserver 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 lattenzionese 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: WebMobileWeb Mobile applications (iOS, wp7, android, balckberry)Scrivi a:lucio@savethemom.com