Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Node.jsShould ruby developers care?                               09.02.2011
About • Felix Geisendörfer • 23 years • Berlin, Germany
Core Contributor                    &              Module Authornode-mysql                      node-formidable
File uploading & processing as an infrastructure     service for web & mobile applications.
About this talk
Nodes goal is to provide an easy way to build        scalable network programs.
Node.js• Created by Ryan Dahl• Google’s V8 JavaScript engine (no DOM)• Module system, I/O bindings, Common Protocols
Installing$ git clone git://github.com/ry/node.git$ cd node$ ./configure$ make install
Hello World$ cat test.jsconsole.log(Hello World);$ node test.jsHello World
Ingredients         libeio            libevc-ares                      V8             http_parser
Philosophy• Just enough core-library to do I/O• Non-blocking• Close to the underlaying system calls
Non-blocking I/O
Blocking I/Ovar a = db.query(SELECT A);console.log(result a:, a);var b = db.query(SELECT B);console.log(result b:, b);    ...
Non-Blocking I/Odb.query(SELECT A, function(result) {  console.log(result a:, result);});db.query(SELECT B, function(resul...
Non-Blocking I/O• Offload most things to the kernel and poll  for changes (select, epoll, kqueue, etc.)• Thread pool for an...
Why JavaScript?     3 Reasons
#1 - The good parts
V8 (Chrome)SpiderMonkey (Firefox)     JavaScriptCore (Safari)      #2 - JS Engine Wars       Chakra (IE9)        Carakan (...
#3 - No I/O in the core
What about event machine?  • Can’t use blocking I/O libraries  • No code sharing between client and server  • Might be a v...
Frameworks
Frameworks• Express (popular)• Fab (revolutionary)
Rails still kicks node’s assin terms of productivity
Suitable Applications• Singe-page apps• Real time• Crawlers
More Applications• Process monitoring• File uploading• Streaming
What about all those    callbacks?
db.query(SELECT A, function() {  db.query(SELECT B, function() {    db.query(SELECT C, function() {      db.query(SELECT D...
You are holding it wrong!
Nested Callbacks• Function does too many things, break it up• Use an sequential abstraction library• Could be a sign that ...
Syntactical Sugar
CoffeeScript
Ready for production?
Ready for production?• 0.4 to be released this month• API has settled down for most parts• Very few bugs, but YMMV
Things that suck
Things that suck• Stack traces are lost at the event loop  boundary• Utilizing multiple cores requires multiple  processes...
Speed
Speedvar http = require(’http’)var b = new Buffer(1024*1024);http.createServer(function (req, res) {  res.writeHead(200); ...
Speed100 concurrent clients1 megabyte responsenode 822 req/secnginx 708thin 85mongrel 4(bigger is better)                 ...
Speed• NGINX peaked at 4mb of memory• Node peaked at 60mb• Very special circumstances                                  by ...
Questions?✎   @felixge / felix@debuggable.com
Bonus Slides!
Buffers
Buffers• Raw C memory allocation• Similar to an array of integers• Can be converted to and from JS strings
Buffersbuffer.write(Hello Buffer);buffer.toString(utf-8);buffer[0] = 23;buffer.slice(10, 20);
Reverse Hello World$ cat reverse_hello.jsvar net = require(net);net.createServer(function(socket) {  socket.on(data, funct...
Streams
“Streams are to time as arrays are to space.”                        -- Jed Schmidt @ JSConf.eu
Streamsstream.write(new Buffer([0x27, 0xC3]);stream.pause();stream.resume();stream.destroy();
Streamsstream  .on(drain, function() {})  .on(data, function(buffer) {})  .on(end, function() {});
Streams$ cat echo.jsvar net = require(net);net.createServer(function(socket) {  socket.pipe(socket);}).listen(0x27C3);$ no...
Questions?✎   @felixge / felix@debuggable.com
Nodejs - Should Ruby Developers Care?
Upcoming SlideShare
Loading in …5
×

Nodejs - Should Ruby Developers Care?

14,236 views

Published on

Talk given at the Atlanta Ruby Meetup (http://www.meetup.com/atlantaruby/) on Feb 9, 2011.

Published in: Technology

Nodejs - Should Ruby Developers Care?

  1. 1. Node.jsShould ruby developers care? 09.02.2011
  2. 2. About • Felix Geisendörfer • 23 years • Berlin, Germany
  3. 3. Core Contributor & Module Authornode-mysql node-formidable
  4. 4. File uploading & processing as an infrastructure service for web & mobile applications.
  5. 5. About this talk
  6. 6. Nodes goal is to provide an easy way to build scalable network programs.
  7. 7. Node.js• Created by Ryan Dahl• Google’s V8 JavaScript engine (no DOM)• Module system, I/O bindings, Common Protocols
  8. 8. Installing$ git clone git://github.com/ry/node.git$ cd node$ ./configure$ make install
  9. 9. Hello World$ cat test.jsconsole.log(Hello World);$ node test.jsHello World
  10. 10. Ingredients libeio libevc-ares V8 http_parser
  11. 11. Philosophy• Just enough core-library to do I/O• Non-blocking• Close to the underlaying system calls
  12. 12. Non-blocking I/O
  13. 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. 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. 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. 16. Why JavaScript? 3 Reasons
  17. 17. #1 - The good parts
  18. 18. V8 (Chrome)SpiderMonkey (Firefox) JavaScriptCore (Safari) #2 - JS Engine Wars Chakra (IE9) Carakan (Opera)
  19. 19. #3 - No I/O in the core
  20. 20. What about event machine? • Can’t use blocking I/O libraries • No code sharing between client and server • Might be a valid choice if integrating with existing ruby code
  21. 21. Frameworks
  22. 22. Frameworks• Express (popular)• Fab (revolutionary)
  23. 23. Rails still kicks node’s assin terms of productivity
  24. 24. Suitable Applications• Singe-page apps• Real time• Crawlers
  25. 25. More Applications• Process monitoring• File uploading• Streaming
  26. 26. What about all those callbacks?
  27. 27. db.query(SELECT A, function() { db.query(SELECT B, function() { db.query(SELECT C, function() { db.query(SELECT D, function() { // ouch }); }); });});
  28. 28. You are holding it wrong!
  29. 29. Nested Callbacks• Function does too many things, break it up• Use an sequential abstraction library• Could be a sign that ruby is a better choice
  30. 30. Syntactical Sugar
  31. 31. CoffeeScript
  32. 32. Ready for production?
  33. 33. Ready for production?• 0.4 to be released this month• API has settled down for most parts• Very few bugs, but YMMV
  34. 34. Things that suck
  35. 35. Things that suck• Stack traces are lost at the event loop boundary• Utilizing multiple cores requires multiple processes• GC can be problematic
  36. 36. Speed
  37. 37. 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
  38. 38. Speed100 concurrent clients1 megabyte responsenode 822 req/secnginx 708thin 85mongrel 4(bigger is better) by Ryan Dahl
  39. 39. Speed• NGINX peaked at 4mb of memory• Node peaked at 60mb• Very special circumstances by Ryan Dahl
  40. 40. Questions?✎ @felixge / felix@debuggable.com
  41. 41. Bonus Slides!
  42. 42. Buffers
  43. 43. Buffers• Raw C memory allocation• Similar to an array of integers• Can be converted to and from JS strings
  44. 44. Buffersbuffer.write(Hello Buffer);buffer.toString(utf-8);buffer[0] = 23;buffer.slice(10, 20);
  45. 45. Reverse Hello World$ cat reverse_hello.jsvar net = require(net);net.createServer(function(socket) { socket.on(data, function(buffer) { console.log(buffer); });}).listen(0x27C3);$ node reverse_hello.js &[1] 3523$ echo "hello world" | nc localhost 10179<Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a>
  46. 46. Streams
  47. 47. “Streams are to time as arrays are to space.” -- Jed Schmidt @ JSConf.eu
  48. 48. Streamsstream.write(new Buffer([0x27, 0xC3]);stream.pause();stream.resume();stream.destroy();
  49. 49. Streamsstream .on(drain, function() {}) .on(data, function(buffer) {}) .on(end, function() {});
  50. 50. Streams$ cat echo.jsvar net = require(net);net.createServer(function(socket) { socket.pipe(socket);}).listen(0x27C3);$ node echo.js &[1] 6207$ nc 127.0.0.1 10179Hi, how are you?Hi, how are you?
  51. 51. Questions?✎ @felixge / felix@debuggable.com

×