nodejs-should-ruby-developers-care.pdf (733...
Transcript of nodejs-should-ruby-developers-care.pdf (733...
![Page 1: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/1.jpg)
Node.jsShould ruby developers care?
09.02.2011
![Page 2: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/2.jpg)
About
• Felix Geisendörfer
• 23 years
• Berlin, Germany
![Page 3: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/3.jpg)
Core Contributor
&
Module Author
node-mysql node-formidable
![Page 4: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/4.jpg)
File uploading & processing as an infrastructure service for web & mobile applications.
![Page 5: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/5.jpg)
About this talk
![Page 6: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/6.jpg)
Node's goal is to provide an easy way to build scalable network programs.
![Page 7: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/7.jpg)
Node.js
• Created by Ryan Dahl
• Google’s V8 JavaScript engine (no DOM)
• Module system, I/O bindings, Common Protocols
![Page 8: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/8.jpg)
Installing
$ git clone \git://github.com/ry/node.git$ cd node$ ./configure$ make install
![Page 9: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/9.jpg)
Hello World
$ cat test.jsconsole.log('Hello World');
$ node test.jsHello World
![Page 10: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/10.jpg)
Ingredients
V8
libev
http_parser
c-ares
libeio
![Page 11: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/11.jpg)
Philosophy
• Just enough core-library to do I/O
• Non-blocking
• Close to the underlaying system calls
![Page 12: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/12.jpg)
Non-blocking I/O
![Page 13: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/13.jpg)
Blocking I/O
var 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)
![Page 14: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/14.jpg)
Non-Blocking I/O
db.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)
![Page 15: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/15.jpg)
Non-Blocking I/O
• Offload most things to the kernel and poll for changes (select, epoll, kqueue, etc.)
• Thread pool for anything else
![Page 16: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/16.jpg)
Why JavaScript?3 Reasons
![Page 17: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/17.jpg)
#1 - The good parts
![Page 18: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/18.jpg)
#2 - JS Engine Wars
V8 (Chrome)
Chakra (IE9)
SpiderMonkey (Firefox) JavaScriptCore (Safari)
Carakan (Opera)
![Page 19: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/19.jpg)
#3 - No I/O in the core
![Page 20: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/20.jpg)
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
![Page 21: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/21.jpg)
Frameworks
![Page 22: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/22.jpg)
Frameworks
• Express (popular)
• Fab (revolutionary)
![Page 23: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/23.jpg)
Rails still kicks node’s ass in terms of productivity
![Page 24: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/24.jpg)
Suitable Applications
• Singe-page apps
• Real time
• Crawlers
![Page 25: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/25.jpg)
More Applications
• Process monitoring
• File uploading
• Streaming
![Page 26: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/26.jpg)
What about all those callbacks?
![Page 27: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/27.jpg)
db.query('SELECT A', function() { db.query('SELECT B', function() { db.query('SELECT C', function() { db.query('SELECT D', function() { // ouch }); }); });});
![Page 28: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/28.jpg)
![Page 29: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/29.jpg)
You are holding it wrong!
![Page 30: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/30.jpg)
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
![Page 31: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/31.jpg)
Syntactical Sugar
![Page 32: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/32.jpg)
CoffeeScript
![Page 33: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/33.jpg)
Ready for production?
![Page 34: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/34.jpg)
Ready for production?
• 0.4 to be released this month
• API has settled down for most parts
• Very few bugs, but YMMV
![Page 35: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/35.jpg)
Things that suck
![Page 36: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/36.jpg)
Things that suck
• Stack traces are lost at the event loop boundary
• Utilizing multiple cores requires multiple processes
• GC can be problematic
![Page 37: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/37.jpg)
Speed
![Page 38: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/38.jpg)
Speed
var 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
![Page 39: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/39.jpg)
Speed
100 concurrent clients1 megabyte response
node 822 req/secnginx 708thin 85mongrel 4
(bigger is better)by Ryan Dahl
![Page 40: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/40.jpg)
Speed
• NGINX peaked at 4mb of memory
• Node peaked at 60mb
• Very special circumstances
by Ryan Dahl
![Page 42: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/42.jpg)
Bonus Slides!
![Page 43: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/43.jpg)
Buffers
![Page 44: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/44.jpg)
Buffers
• Raw C memory allocation
• Similar to an array of integers
• Can be converted to and from JS strings
![Page 45: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/45.jpg)
Buffers
buffer.write('Hello Buffer');
buffer.toString('utf-8');
buffer[0] = 23;
buffer.slice(10, 20);
![Page 46: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/46.jpg)
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>
![Page 47: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/47.jpg)
Streams
![Page 48: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/48.jpg)
“Streams are to time as arrays are to space.”-- Jed Schmidt @ JSConf.eu
![Page 49: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/49.jpg)
Streams
stream.write(new Buffer([0x27, 0xC3]);
stream.pause();
stream.resume();
stream.destroy();
![Page 50: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/50.jpg)
Streams
stream
.on('drain', function() {})
.on('data', function(buffer) {})
.on('end', function() {});
![Page 51: nodejs-should-ruby-developers-care.pdf (733 KB)felixge.s3.amazonaws.com/11/nodejs-should-ruby-developers-care.pdf · Philosophy • Just enough core-library to do I/O • Non-blocking](https://reader035.fdocuments.us/reader035/viewer/2022062910/5b9d413b09d3f2df1f8c8d49/html5/thumbnails/51.jpg)
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?