SlideShare a Scribd company logo
explained
               March 2, 2012




Jeff Kunkle
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
1   Theory
2   Challenges
3   Benefits
Theory
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
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
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                   process    format
  request                  results   response




             query db or        write to
             web service        log file
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
Scaling with Processes
             Handles up to 4 concurrent requests
 process 1
 process 2
 process 3
 process 4

                High memory usage
                Process scheduling overhead
Scaling with an Event Loop
             Handles many concurrent requests in one process/thread
 process 1




                              network    filesystem

                        Thread Pool and Async I/O APIs
Event Loop
                     Thread Pool
    Event              filesystem
    Queue
                       network
             Event
             Loop      process

                        other
Platform
                node standard library

                     node bindings
                (http, socket, file system)


       thread pool    event loop         crypto     DNS
  V8
         (libeio)        (libev)       (OpenSSL)   (c-ares)
Examples

setTimeout(function () {
  console.log('This will still run.');
}, 500);
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/');
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);
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);
});
Challenges
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);
    });
  }
});
Debugging
CPU-intensive Tasks

    1 thread

               be careful!
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
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?
                                       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 packages
          as of 3:00pm EDT 2012.03.02
Conceptually Simple
                      Thread Pool
    Event               filesystem
    Queue
                        network
            Event
            Loop        process

                         other
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 Node.js Theory
     Understand JavaScript
     Understand Event-based Programming


 You just need to learn new APIs
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
   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

More Related Content

Node.js Explained

  • 1. explained March 2, 2012 Jeff Kunkle
  • 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)
  • 14. Examples setTimeout(function () { console.log('This will still run.'); }, 500);
  • 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); }); } });
  • 21. CPU-intensive Tasks 1 thread be careful!
  • 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
  • 25. Lightweight Single thread
  • 26. Dead-lock Free Single thread simplifies concurrency
  • 27. Monoglot Programming JavaScript on the client JavaScript on the server
  • 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
  • 30. Lua
  • 31. Perl
  • 32. PHP
  • 34. JRuby
  • 36. Java
  • 37. C
  • 38. Vibrant Community 7,661 packages as of 3:00pm EDT 2012.03.02
  • 39. Conceptually Simple Thread Pool Event filesystem Queue network Event Loop process other
  • 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