Node.js As a networking tool 28.12.2010
About Contributor Co-founder Felix Geisendörfer node.js driver node-formidable
Who are you?
Node.js?
JavaScript?
Port = 80 ?
Port != 80 ?
Node's 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
N et w or k Hello World Ed it io n $ cat hello.js var net = require('net'); net.createServer(function(socket) { socket.write('hello worldn'); socket.end(); }).listen(0x27C3); $ node hello.js & [1] 3591 $ nc localhost 10179 hello world
Why JavaScript? 3 Reasons
#1 - The good parts
V8 (Chrome) SpiderMonkey (Firefox) JavaScriptCore (Safari) #2 - JS Engine Wars Chakra (IE9) Carakan (Opera)
#3 - No I/O or Threads
Non-blocking I/O
Blocking I/O db.query('SELECT A'); console.log('query A done'); db.query('SELECT B'); console.log('query B done'); Time = SUM(A, B)
Non-Blocking I/O db.query('SELECT A', function(result) { console.log('query A done'); }); db.query('SELECT B', function(result) { console.log('query B done'); }); Time = MAX(A, B)
libev by Marc Lehmann
libev • An infinite loop (event loop) • Polls the OS for events (select, epoll, kqueue, ...) • Allows you to register watchers / callbacks for the events you care about
Buffers
Buffers • Raw C memory allocation • Similar to an array of integers • Can be converted to and from JS strings
Buffers buffer.write('Hello Buffer'); buffer.toString('utf-8'); buffer[0] = 23; buffer.slice(10, 20);
Reverse Hello World $ cat reverse_hello.js var 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>
Streams
“Streams are to time as arrays are to space.” -- Jed Schmidt @ JSConf.eu
Streams stream.write(new Buffer([0x27, 0xC3]); stream.pause(); stream.resume(); stream.destroy();
Streams stream .on('drain', function() {}) .on('data', function(buffer) {}) .on('end', function() {});
Streams $ cat echo.js var net = require('net'); net.createServer(function(socket) { socket.pipe(socket); }).listen(0x27C3); $ node echo.js & [1] 6207 $ nc 127.0.0.1 10179 Hi, how are you? Hi, how are you?
pcap module Sniffing data with node.js
pcap module • Node.js bindings for libpcap • Simple install: `npm install pcap` • “Scriptable tcpdump”
pcap module $ cat pcap.js var util = require('util'); var pcap = require('pcap'); var filter = 'tcp port '+0x27C3; var session = pcap.createSession('lo0', filter); session.on('packet', function(packet) { packet = pcap.decode.packet(packet); console.log(pcap.print.packet(packet)); if (packet.link.ip.tcp.data) { util.print(packet.link.ip.tcp.data.toString()); } });
pcap module $ node hello.js > /dev/null & [1] 3592 $ sudo node pcap.js & [2] 3593 $ nc 127.0.0.1 10179 > /dev/null loopback 127.0.0.1:54078 -> 127.0.0.1:10179 TCP len 64 [syn] loopback 127.0.0.1:10179 -> 127.0.0.1:54078 TCP len 64 [ack,syn] loopback 127.0.0.1:54078 -> 127.0.0.1:10179 TCP len 52 [ack] loopback 127.0.0.1:10179 -> 127.0.0.1:54078 TCP len 64 [ack,psh] hello world loopback 127.0.0.1:54078 -> 127.0.0.1:10179 TCP len 52 [ack]
Recap • Binary data handling (Buffers) • I/O abstraction (Streams) • Packet sniffing (node-pcap)
Node can also do • HTTP • Child processes • Unix domain sockets • DNS • UDP • Crypto • ...
Speed
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
Speed 100 concurrent clients 1 megabyte response node 822 req/sec nginx 708 thin 85 mongrel 4 (bigger is better) by Ryan Dahl
Speed • NGINX peaked at 4mb of memory • Node peaked at 60mb • Very special circumstances by Ryan Dahl
Danger, Will Robinson
Danger, Will Robinson Node makes it trivial to manage thousands of connections on multiple protocol levels.
File uploading & processing as a service for other web applications.
Questions? ✎ @felixge / felix@debuggable.com
Questions? ✎ @felixge / felix@debuggable.com
Bonus Slides!
Addons
Addons • Add bindings to your favorite C/C++ libraries • Can be written as a mix of C++ / JavaScript
Addons #include <v8.h> #include <node.h> #include <unistd.h> using namespace v8; static Handle<Value> Fork(const Arguments& args) { HandleScope scope; pid_t pid = fork(); if (pid < 0) { return ThrowException(Exception::Error(String::New("fork: could not fork, pid < 0. see man fork"))); } if (pid == 0) { ev_default_fork(); } return scope.Close(Number::New(pid)); } extern "C" void init (Handle<Object> target) { HandleScope scope; NODE_SET_METHOD(target, "fork", Fork); }

Node.js - As a networking tool

Editor's Notes

  • #2 \n
  • #3 - Joined the mailing list in June 26, 2009\n- Co-Transloadit\n- When I joined there where #24 people, which in this room we can round to 23 : )\n- First patch in September 2009\n- Now we have &gt; 3200 members\n
  • #4 \n
  • #5 \n
  • #6 \n
  • #7 \n
  • #8 \n
  • #9 &amp;#x201C;Easy&amp;#x201D; and &amp;#x201C;Scalable&amp;#x201D; : )\n\nNode makes Hard -&gt; Easy, Easy -&gt; Hard\n
  • #10 \n
  • #11 Ported to C this turns into 100-200 lines of code\n
  • #12 Why not python / ruby / java\n
  • #13 World&amp;#x2019;s most misunderstood programming language\nClosures\nJSON\nFlexible\n
  • #14 Spider Monkey: TraceMonkey, J&amp;#xE4;gerMonkey\nJavaScriptCore: SquirrelFish Extreme / Nitro\n
  • #15 \n
  • #16 \n
  • #17 Disk / Network access is 1.000-1.000.000 slower than CPU / Ram access\n
  • #18 \n
  • #19 \n
  • #20 \n
  • #21 \n
  • #22 \n
  • #23 \n
  • #24 \n
  • #25 \n
  • #26 \n
  • #27 \n
  • #28 \n
  • #29 - At 103 characters perfectly tweet sized\n
  • #30 \n
  • #31 \n
  • #32 \n
  • #33 \n
  • #34 All you need for networking adventures\n
  • #35 \n
  • #36 \n
  • #37 \n
  • #38 ~Benchmark Ryan Dahl did: 6 month ago\n
  • #39 Anti Benchmark: Huge String\n
  • #40 \n
  • #41 \n
  • #42 - 2013: 90% will be internet video\n- Transloadit can help you handling the upload and encoding\n- Built node.js\n
  • #43 Mention podcast with Tim Pritlove\n
  • #44 \n
  • #45 \n
  • #46 \n
  • #47 \n