Node.js Explained
- 2. Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network
applications. Node.js uses an event driven, non-blocking I/O model that makes it lightweight and
efficient, perfect for data-intensive real-time applications that run across distributed devices.
DOWNLOAD DOCS
v0.6.11
- 3. 1 Theory
2 Challenges
3 Benefits
- 5. I/O Latency
L1 3 cycles
L2 14 cycles
RAM 250 cycles
Disk 41,000,000
Network 240,000,000
Source: Ryan Dahl’s 2008.11.08 node.js presentation
- 6. CPU Cycles
300,000,000
240,000,000
225,000,000
150,000,000
75,000,000
41,000,000
3 14 250
0
L1 L2 RAM Disk Network
- 7. I/O Latency
L2 RAM Disk Network
L1 5 83 13,666,666 80,000,000
L2 18 2,928,571 17,142,857
RAM 164,000 960,000
Disk 6
- 8. Waiting...
route process format
request results response
query db or write to
web service log file
- 9. Scaling with Threads
Handles up to 4 concurrent requests
thread 1
thread 2
thread 3
thread 4
Context switching overhead
Execution stacks take up memory
Complicates concurrency
- 10. Scaling with Processes
Handles up to 4 concurrent requests
process 1
process 2
process 3
process 4
High memory usage
Process scheduling overhead
- 11. Scaling with an Event Loop
Handles many concurrent requests in one process/thread
process 1
network filesystem
Thread Pool and Async I/O APIs
- 12. Event Loop
Thread Pool
Event filesystem
Queue
network
Event
Loop process
other
- 13. Platform
node standard library
node bindings
(http, socket, file system)
thread pool event loop crypto DNS
V8
(libeio) (libev) (OpenSSL) (c-ares)
- 15. HTTP Server
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello Worldn');
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
- 16. Serve a Static File
var http = require('http');
http.createServer(function (request, response) {
fs.readFile('/etc/passwd', function (err, data) {
if (err) {
response.writeHead(500, err.message);
response.end();
} else {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end(data);
}
});
}).listen(8124);
- 17. Read a File in Chunks
var fs = require('fs');
var stream = fs.createReadStream('huge.txt');
stream.on('data', function (data) {
console.log(data);
});
stream.on('end', function () {
console.log('done');
});
stream.on('error', function (err) {
console.log(err);
});
- 19. Asynchronous I/O
var fs = require('fs');
fs.stat('/etc/passwd', function (err, stats) {
if (err) return;
if (stats.isFile()) {
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});
}
});
- 22. Rapidly Changing
v0.6.12 2012.03.02 v0.7.5 2012.02.23
v0.6.11 2012.02.17 v0.7.4 2012.02.14
v0.6.10 2012.02.02 v0.7.3 2012.02.07
v0.6.9 2012.01.27 v0.7.2 2012.02.01
v0.6.8 2012.01.19 v0.7.1 2012.01.23
v0.6.7 2012.01.06 v0.7.0 2012.01.16
- 29. Fast Ruby 1.9 used what fraction? times more?
Benchmark Time Memory Code
pidigits 1
/16
1/
2
1/
3
reverse-complement 1/
2
1/
2
1/
2
k-nucleotide 2× 1/
2 ±
binary-trees 6× 1/
2 ±
fasta 7× 6× ±
regex-dna 9× 2× ±
n-body 16× 1/
4 ±
spectral-norm 19× 1/
2 ±
fannkuch-redux 51× ± ±
Source: http://shootout.alioth.debian.org/u32/benchmark.php
- 40. Small Core
36 JavaScript source files
36 C++ source files
as of March 1, 2012 at 10:50pm on v0.6 branch
- 41. Short Learning Curve
Understand Node.js Theory
Understand JavaScript
Understand Event-based Programming
You just need to learn new APIs
- 43. 1 install Node from source
2 write some small programs
3 read the source
4 re-implement a popular pkg
- 44. Check out some Packages
express
web framework
async helpers
async
persist socket.io
realtime networking
ORM framework
db-migrate vowsframework
BDD
database migrations
dnode
RPC
java to Java API
bridge