Nodejs - A quick tour (v4)

  • 13,417 views
Uploaded on

Talk given at the Atlanta JS Meetup (@ATLJavaScript) on Feb 15, 2011.

Talk given at the Atlanta JS Meetup (@ATLJavaScript) on Feb 15, 2011.

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
13,417
On Slideshare
0
From Embeds
0
Number of Embeds
11

Actions

Shares
Downloads
64
Comments
0
Likes
6

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. node.js A quick tour 15.02.2011 (v4)
  • 2. About • Felix Geisendörfer • 23 years • Berlin, Germany@felixge
  • 3. Core Contributor & Module Authornode-mysql node-formidable
  • 4. File uploading & processing as an infrastructure service for web & mobile applications.
  • 5. Audience?
  • 6. Nodes goal is to provide an easy way to build scalable network programs.
  • 7. Node.js• Created by Ryan Dahl• Google’s V8 JavaScript engine (no DOM)• Module system, I/O bindings, Common Protocols
  • 8. Installing$ git clone git://github.com/ry/node.git$ cd node$ ./configure$ make install
  • 9. Hello World$ cat test.jsconsole.log(Hello World);$ node test.jsHello World
  • 10. Ingredients libeio libevc-ares V8 http_parser
  • 11. Philosophy• Just enough core-library to do I/O• Non-blocking• Close to the underlaying system calls
  • 12. Non-blocking I/O
  • 13. 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)
  • 14. 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)
  • 15. Non-Blocking I/O• Offload most things to the kernel and poll for changes (select, epoll, kqueue, etc.)• Thread pool for anything else
  • 16. Single Threadedvar a = [];function f() { a.push(1); a.push(2);}setTimeout(f, 10);setTimeout(f, 10);
  • 17. 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);
  • 18. 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);
  • 19. API Overview
  • 20. CommonJS Modules$ cat hello.jsexports.world = function() { return Hello World;};$ cat main.jsvar hello = require(./hello);console.log(hello.world());$ node main.jsHello World
  • 21. 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"
  • 22. 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!
  • 23. 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!
  • 24. DNS$ cat dns.jsvar dns = require(dns);dns.resolve(nodejs.org, function(err, addresses) { console.log(addresses);});$ node dns.js[ 8.12.44.238 ]
  • 25. 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!
  • 26. And much more• UDP • Buffer• Crypto • Script• Assert • EcmaScript5 ...
  • 27. Suitable Applications
  • 28. Suitable Applications• Singe-page apps• Real time• Crawlers
  • 29. More Applications• Async chaining of unix tools• Streaming• File uploading
  • 30. Interesting projects
  • 31. Package management
  • 32. Web Frameworks• Express.js (Sinatra clone)• Fab.js (Mind-bending & awesome)
  • 33. DOM• node-htmlparser• jquery• node.io
  • 34. WebSockets Socket.IO
  • 35. 1171 modules in npm
  • 36. Ready for production?
  • 37. Ready for production?• 0.4 was released last week• API has settled down for most parts• Very few bugs, but YMMV
  • 38. Things that suck
  • 39. 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
  • 40. Community
  • 41. Benevolent Dictator For Life Ryan Dahl
  • 42. Community• Mailing list (nodejs, nodejs-dev)• IRC (#node.js)
  • 43. Hosting
  • 44. Questions?✎ @felixge / felix@debuggable.com
  • 45. Bonus Slides
  • 46. Speed
  • 47. 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
  • 48. Speed100 concurrent clients1 megabyte responsenode 822 req/secnginx 708thin 85mongrel 4(bigger is better) by Ryan Dahl
  • 49. Speed• NGINX peaked at 4mb of memory• Node peaked at 60mb• Very special circumstances by Ryan Dahl
  • 50. Questions?✎ @felixge / felix@debuggable.com