Вы находитесь на странице: 1из 57

Node.

js
A Guided Tour
Presenter: C. Aaron Cois, Ph.D.

The web is changing


It

used to be about consumption

Real-time Interaction

Real-time Interaction
Real-Time

Games

Chat
Stock

tickers Twitter Feeds Collaboration Creation on a massive scale

What do we need to make it happen?


Fast,

persistent I/O

HTTP wasnt built for this Servers need to push data to clients Polling is slow and inefficient

Scalability Usability Maintainability

Outline
What

is Node.js? Technology Overview How does it work? Demo Code! Deployment and Hosting

What is Node.js?

Node.js
Node.js

is an event-driven, server-side JavaScript environment


Based on the V8 JavaScript Engine, developed by Google

Most

importantly, node.js is a

server-side runtime environment, that compiles and executes JavaScript very efficiently.

Platforms
Runs

on OSX, Linux, Windows installers for:

Clickable

Windows Mac OSX

Linux

has apt-get and yum

Why Node?
Node.js

is specifically designed for building fast, efficient, scalable network applications Node uses an event-driven, non-blocking I/O model to maximize efficiency

Technology: V8 Engine

Developed by Google Ships with the Google Chrome web browser Allows Chrome to run JavaScript code much faster

It does this by compiling the JavaScript directly into native machine code As opposed to interpreting JavaScript, or execute it as bytecode

What does this mean for us, and for Node.js?

Technology: JavaScript
JavaScript

is:

A fully-functional programming language


Capable

of doing anything other traditional languages (C++, Java, Ruby, etc) can do

Has an excellent event model Traditionally resigned to the context of the web application frontend
i.e.

running inside a web browser

Technology: JavaScript2
Theres

no reason the JavaScript language cant be used elsewhere (say, server-side)

This is where node.js comes in, executing JavaScript efficiently on the server-side

JavaScript

brings to Node.js:

Natural event-based programming, ideal for client-server applications A known language, with low overhead

Who is using Node.js?

How does it work?

The Basic Idea

I/O is expensive

*http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

Ways to deal with I/O


Synchronous

One requests at a time, first come, first serve

Fork

New process for each request

Threads

New thread for each request


*http://www.nightmare.com/medusa/async_sockets.html

Another Thesis

Thread-per-connection is memory-expensive

Traditional Threaded Model


N

worker threads/processes Each incoming connection handed to a worker


That

worker is now in use, and can handle no other connection, even if it is waiting on:
File

I/O DB I/O Network I/O etc

The life of a worker

Waiting on File I/O

Waiting on Network Response Time

Waiting on DB

The life of a worker


Blocking Wastes Cycles

Waiting on File I/O

Waiting on Network Response Time

Waiting on DB

The Other Basic Idea

Writing (Good) Threaded Code is DIFFICULT

The life of N workers

Thread 1

Thread 2

Thread 3

Thread 4

Time

The life of N workers

Thread 1

Thread 2

Thread 3

Thread 4

Time

The life of N workers

Thread 1

Thread 2

ALL PROCESSES IDLE


Thread 3 Thread 4

Time

Even worse
If

all threads are in use, every incoming connection is blocked can cause massive traffic jams on high-throughput applications

This

Is this the only way?

There is another

The Node.js way

Axiom:

Multi-Threaded code
Is difficult to write Is difficult to debug Sucks up more dev/test/maintenance cycles Most often has inefficient performance

Conclusion:

Screw it: Write code using a single thread

Single threaded?!?
Skeptical? I dont blame you

But hear me out

Node.js Event Loop


Event

Loop (from Wikipedia):

A construct that waits for and dispatches events or messages in a program

Instead

of performing I/O ourselves, we dispatch I/O events to Nodes event loop


It handles threads, process optimization, concurrency, etc

Node.js Event Loop

DB I/O command to event loop Net I/O command to event loop File I/O command to event loop Time

Node.js Event Loop

DB I/O command to event loop Net I/O command to event loop File I/O command to event loop Time

Open for more work!

Node.js app code


Is

run entirely in a single thread Passes I/O requests to the event loop, along with callbacks
Your

code then:

Goes to sleep Uses no system resources Will be notified via callback when I/O is complete

Callback example
var filename = test_file.txt; fs.open(filename, w, function(err, file) { if (err) throw err; });

Callback example
Filesystem module forwards task to event loop

var file = (test_file.txt); fs.open(file, w, function(err, file) { if (err) throw err; });

Callback example
Callback is invoked when work is complete

var file = (test_file.txt); fs.open(file, w, function(err, file) { if (err) throw err; });

This is not magic


The

following:

for(i=0; i<5; i++) { sleep(1000); }


Will

block the entire Node event loop for 5 seconds

Node is in charge
Let

Node.js handle

Dispatch Concurrency (most) Async operations

What

Node doesnt promise:

To not block when you tell it to Order of execution (e.g. forked parallel processes)

Interlude: Modules

Node.js API

Node provides an API in the form of modules (a.k.a. libraries)

Modules work with event loop to dispatch async tasks

API modules are installed along with Node

They provide standard application framework functionality


STDIO: console logging, timing, tracing File System: File system access etc

A Few Good Modules


Net HTTP File System

Network socket support HTTP communication File system access

Crypto
Streams Many more

Cryptography
STDIO

Node.js Community
Additionally,

the Node.js community maintains excellent modules to enhance the capabilities of Node modules operate as

These

Libraries Toolkits Frameworks and much more.

Notable Community Modules


Express Socket.io Passport/Everyauth

Web App Framework Websockets, etc Authentication

Jade
Connect Less

HTML Template Engine


Middleware collection Simplified CSS

Lets see some code!

Node Web Server


var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');

}).listen(1337, '127.0.0.1');

Node TCP Listener


var net = require('net'); var server = net.createServer(function (socket) { socket.write('Echo server\r\n'); socket.pipe(socket); }); server.listen(1337, '127.0.0.1');

Live Demo

http://techfestchat.jit.su

Hosting courtesy of Nodejitsu

Any .NET Devs in the room?


Microsoft

has been expending a lot of effort to make Node a first class framework

And now

A sneak preview!

MS WebMatrix 2
Open WebMatrix 2

Node.js Deployment and Hosting

Cloud Hosting

Heroku Microsoft Azure Nodejitsu Cloud Foundry Nodester DotCloud Appfog Joyent (coming soon)

Thanks!

Feel free to look me up at:

http://www.codehenge.net I love questions, collaborations, and talking with people!

If you are interested in formal Node.js learning, I also have a course available at:

http://www.udemy.com/learn-nodejs-byexample/