Nodejs - A quick tour (v5)
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • 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
3,283
On Slideshare
3,281
From Embeds
2
Number of Embeds
1

Actions

Shares
Downloads
39
Comments
0
Likes
1

Embeds 2

http://www.techgig.com 2

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. node.js A quick tour 15.02.2011 (v4)
  • 2. About • Felix Geisendörfer • Berlin, Germany • Debuggable Ltd
  • 3. @felixge
  • 4. File uploading & processing as an infrastructure service for web & mobile applications.
  • 5. Core Contributor & Module Authornode-mysql node-formidable
  • 6. Audience?
  • 7. Server-side JavaScript
  • 8. Server-side JavaScript• Netscape LiveWire (1996)• Rhino (1997)• 50+ plattforms since then
  • 9. What was the problem?• Slow engines• Lack of interest in JS until ~2005• Better competing plattforms
  • 10. Why JavaScript? 3 Reasons
  • 11. #1 - The good parts
  • 12. V8 (Chrome)SpiderMonkey (Firefox) JavaScriptCore (Safari) #2 - JS Engine Wars Chakra (IE9) Carakan (Opera)
  • 13. #3 - No I/O in the core
  • 14. Nodes goal is to provide an easy way to build scalable network programs.
  • 15. Node.js• Created by Ryan Dahl• Google’s V8 JavaScript engine (no DOM)• Module system, I/O bindings, Common Protocols
  • 16. Installing$ git clone git://github.com/ry/node.git$ cd node$ ./configure$ make install
  • 17. Hello World$ cat test.jsconsole.log(Hello World);$ node test.jsHello World
  • 18. Ingredients libeio libevc-ares V8 http_parser
  • 19. Philosophy• Just enough core-library to do I/O• Non-blocking• Close to the underlaying system calls
  • 20. Non-blocking I/O
  • 21. Blocking I/Ovar a = db.query(SELECT A);console.log(result a:, a);var b = db.query(SELECT B);console.log(result b:, b); Time = SUM(A, B)
  • 22. Non-Blocking I/Odb.query(SELECT A, function(result) { console.log(result a:, result);});db.query(SELECT B, function(result) { console.log(result b:, result);}); Time = MAX(A, B)
  • 23. Non-Blocking I/O• Offload most things to the kernel and poll for changes (select, epoll, kqueue, etc.)• Thread pool for anything else
  • 24. Single Threadedvar a = [];function f() { a.push(1); a.push(2);}setTimeout(f, 10);setTimeout(f, 10);
  • 25. Single Threadedvar a = [];function f() { • [1, 1, 2, 2] ? a.push(1); a.push(2);} • [1, 2, 1, 2] ?setTimeout(f, 10); • BAD ACCESS ?setTimeout(f, 10);
  • 26. Single Threadedvar a = [];function f() { • [1, 1, 2, 2] a.push(1); a.push(2);} • [1, 2, 1, 2]setTimeout(f, 10); • BAD ACCESSsetTimeout(f, 10);
  • 27. API Overview
  • 28. CommonJS Modules$ cat hello.jsexports.world = function() { return Hello World;};$ cat main.jsvar hello = require(./hello);console.log(hello.world());$ node main.jsHello World
  • 29. Child processes$ cat child.jsvar spawn = require(child_process).spawn;var cmd = echo hello; sleep 1; echo world;;var child = spawn(sh, [-c, cmd]);child.stdout.on(data, function(chunk) { console.log(chunk.toString());});$ node child.js"hellon"# 1 sec delay"worldnn"
  • 30. Http Server$ cat http.jsvar http = require(http);http.createServer(function(req, res) { setTimeout(function() { res.writeHead(200); res.end(Thanks for waiting!); }, 1000);}).listen(4000);$ curl localhost:4000# 1 sec delayThanks for waiting!
  • 31. Tcp Server$ cat tcp.jsvar tcp = require(tcp);tcp.createServer(function(socket) { socket .on(connect, function() { socket.write("Hi, How Are You?n> "); }) .on(data, function(data) { socket.write(data); });}).listen(4000);$ nc localhost 4000Hi, How Are You?> Great!Great!
  • 32. DNS$ cat dns.jsvar dns = require(dns);dns.resolve(nodejs.org, function(err, addresses) { console.log(addresses);});$ node dns.js[ 8.12.44.238 ]
  • 33. Watch File$ cat watch.jsvar fs = require(fs);fs.watchFile(__filename, function() { console.log(You changed me!); process.exit(0);});$ node watch.js# edit watch.jsYou changed me!
  • 34. And much more• UDP • Buffer• Crypto • Script• Assert • EcmaScript5 ...
  • 35. Suitable Applications
  • 36. Suitable Applications• Singe-page apps• Real time• Crawlers
  • 37. More Applications• Async chaining of unix tools• Streaming• File uploading
  • 38. Interesting projects
  • 39. Package management
  • 40. Web Frameworks• Express.js (Sinatra clone)• Fab.js (Mind-bending & awesome)
  • 41. DOM• node-htmlparser• jquery• node.io
  • 42. WebSockets Socket.IO
  • 43. 1171 modules in npm
  • 44. Ready for production?
  • 45. Ready for production?• 0.4.2 was released on March 3rd• API has settled down for most parts• Very few bugs, but YMMV
  • 46. Things that suck
  • 47. Things that suck• Stack traces are lost at the event loop boundary• Utilizing multiple cores requires multiple processes• V8: 1.9 GB heap limit / GC can be problematic
  • 48. Community
  • 49. Benevolent Dictator For Life Ryan Dahl
  • 50. Community• Mailing list (nodejs, nodejs-dev)• IRC (#node.js)
  • 51. Hosting
  • 52. Questions?✎ @felixge / felix@debuggable.com
  • 53. Bonus Slides
  • 54. Speed
  • 55. Speedvar http = require(’http’)var b = new Buffer(1024*1024);http.createServer(function (req, res) { res.writeHead(200); res.end(b);}).listen(8000); by Ryan Dahl
  • 56. Speed100 concurrent clients1 megabyte responsenode 822 req/secnginx 708thin 85mongrel 4(bigger is better) by Ryan Dahl
  • 57. Speed• NGINX peaked at 4mb of memory• Node peaked at 60mb• Very special circumstances by Ryan Dahl
  • 58. Questions?✎ @felixge / felix@debuggable.com