node.js: a guided tour

Post on 28-Oct-2014

96 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

This is the slide deck from a talk entitled "Node.js: A Guided Tour" given at Pittsburgh TechFest, 2012. This talk was intended as an introduction to the Node.js framework for fast, scalable network and web applications.Want to learn how to program with Node.js? Check out:http://www.udemy.com/learn-nodejs-by-example/More information on Node.js can be found at the presenter's website: http://www.codehenge.net

TRANSCRIPT

Node.jsA 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 wasn’t built for this Server’s 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

Clickable installers for: 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

There’s no reason the JavaScript language can’t 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 ModelN worker threads/processesEach 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

Waiting on File I/O…

Waiting on Network Response…

The life of a worker…

SQL

Que

ry

Waiting on DB…

Read

File

Send

HTT

P Re

ques

t

Time

Waiting on File I/O…

Waiting on Network Response…

The life of a worker…

SQL

Que

ry

Waiting on DB…

Read

File

Send

HTT

P Re

ques

t

Time

Blocking Wastes Cycles

The Other Basic Idea

Writing (Good) Threaded Code is DIFFICULT

The life of N workers…

Time

Thread 1

Thread 3

Thread 2

Thread 4

The life of N workers…

Time

Thread 1

Thread 3

Thread 2

Thread 4

The life of N workers…

Time

Thread 1

Thread 3

Thread 2

Thread 4

ALL PROCESSES IDLE

Even worse… If all threads are in use, every incoming

connection is blocked

This can cause massive traffic jams on high-throughput applications

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 don’t 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 Node’s event loop It handles threads, process optimization,

concurrency, etc

Node.js Event Loop

File I/O command to event loop

Net I/O command to event loop

DB I/O command to event loop

Read

File

SQL

Que

ry

Send

HTT

P Re

ques

t

Net

I/O

Cal

lbac

k

File

I/O

Cal

lbac

k

DB

I/O C

allb

ack

Time

Node.js Event Loop

File I/O command to event loop

Net I/O command to event loop

DB I/O command to event loop

Open for more work!

Read

File

SQL

Que

ry

Send

HTT

P Re

ques

t

Net

I/O

Cal

lbac

k

File

I/O

Cal

lbac

k

DB

I/O C

allb

ack

Time

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

var file = (“test_file.txt”);

fs.open(file, “w”, function(err, file) { if (err) throw err;});

Filesystem module forwards task to event loop

Callback example

var file = (“test_file.txt”);

fs.open(file, “w”, function(err, file) { if (err) throw err;});

Callback is invoked when work is complete

This is not magic The following:

Will block the entire Node event loop for 5 seconds

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

Node is in charge Let Node.js handle

Dispatch Concurrency (most) Async operations

What Node doesn’t 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 Network socket support

HTTP HTTP communication

File System File system access

Crypto Cryptography

Streams STDIO

Many more…

Node.js Community Additionally, the Node.js community

maintains excellent modules to enhance the capabilities of Node

These modules operate as Libraries Toolkits Frameworks …and much more.

Notable Community Modules

Express Web App Framework

Socket.io Websockets, etc

Passport/Everyauth Authentication

Jade HTML Template Engine

Connect Middleware collection

Less Simplified CSS

Let’s 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-by-example/

top related