node.js explained
DESCRIPTION
Rising from non-existence a few short years ago, Node.js is already attracting the accolades and disdain enjoyed and endured by the Ruby and Rails community just a short time ago. It overtook Rails as the most popular Github repository in 2011 and was selected by InfoWorld for the Technology of the Year Award in 2012. This presentation explains the basic theory and programming model central to Node's approach and will help you understand the resulting benefits and challenges it presents. You can also watch this presentation at http://bit.ly/1362UGATRANSCRIPT
explained
Jeff Kunkle
March 2, 2012
Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable networkapplications. 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
Theory
Benefits
Challenges
123
Theory
I/O LatencyL1 3 cycles
L2 14 cycles
RAM 250 cycles
Disk 41,000,000
Network 240,000,000Source: Ryan Dahl’s 2008.11.08 node.js presentation
0
75,000,000
150,000,000
225,000,000
300,000,000
L1 L2 RAM Disk Network
240,000,000
41,000,000
250143
CPU Cycles
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
Waiting...route
request
query db orweb service
processresults
formatresponse
write tolog file
Scaling with Threads
thread 1
thread 2
thread 3
thread 4
Context switching overheadExecution stacks take up memoryComplicates concurrency
Handles up to 4 concurrent requests
Scaling with Processes
process 1
process 2
process 3
process 4
High memory usage
Handles up to 4 concurrent requests
Process scheduling overhead
Scaling with an Event Loop
process 1
network filesystem
Thread Pool and Async I/O APIs
Handles many concurrent requests in one process/thread
Event Loop
filesystem
network
process
other
EventQueue
Thread Pool
EventLoop
Platformnode standard library
node bindings(http, socket, file system)
V8 thread pool(libeio)
event loop(libev)
DNS(c-ares)
crypto(OpenSSL)
Examples
setTimeout(function () { console.log('This will still run.');}, 500);
HTTP Servervar http = require('http');
http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n');}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
Serve a Static Filevar 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);
Read a File in Chunksvar 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);});
Challenges
Asynchronous I/Ovar 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); }); }});
Debugging
CPU-intensive Tasks
1thread
be careful!
Rapidly Changing
v0.6.11 2012.02.17
v0.7.5 2012.02.23
v0.7.4 2012.02.14
v0.7.3 2012.02.07
v0.7.2 2012.02.01
v0.7.1 2012.01.23
v0.7.0 2012.01.16
v0.6.10 2012.02.02
v0.6.9 2012.01.27
v0.6.8 2012.01.19
v0.6.7 2012.01.06
v0.6.12 2012.03.02
Benefits
Multi-platform
Lightweight
Single thread
Dead-lock Free
Single thread simplifies concurrency
Monoglot Programming
JavaScript on the client
JavaScript on the server
Popular
Fast Ruby 1.9 used what fraction? times more? Ruby 1.9 used what fraction? times more? Ruby 1.9 used what fraction? times more? 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
Lua
Perl
PHP
Python 3
JRuby
Clojure
Java
C
Vibrant Community
7,661 packagesas of 3:00pm EDT 2012.03.02
Conceptually Simple
filesystem
network
process
other
EventQueue
Thread Pool
EventLoop
Small Core
36 JavaScript source files
36 C++ source files
as of March 1, 2012 at 10:50pm on v0.6 branch
Short Learning Curve
Understand JavaScript
Understand Event-based Programming
You just need to learn new APIs
Understand Node.js Theory
Getting Smart
1 install Node from source
2 write some small programs
3 read the source
4 re-implement a popular pkg
Check out some Packages
expressweb framework
persistORM framework
db-migratedatabase migrations
asyncasync helpers
socket.iorealtime networking
dnodeRPC
vowsBDD framework
javabridge to Java API