26
var title = “Node.JS - Blurring the Line Between Client and Server”; $(this).attr(“title”, title); $(this).data({ font: ‘Segoe UI’, size: ‘30pt’, maxLines: ‘3 lines max’ });

var title = “ Node.JS - Blurring the Line Between Client and Server ”;

  • Upload
    azia

  • View
    33

  • Download
    0

Embed Size (px)

DESCRIPTION

var title = “ Node.JS - Blurring the Line Between Client and Server ”;. $(this).attr(“title”, title); $(this).data( { font: ‘Segoe UI’ , size: ‘30pt’ , maxLines : ‘3 lines max’ } );. Agenda. Why Node.JS? Why yet another server framework? What is it? - PowerPoint PPT Presentation

Citation preview

Page 1: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

var title = “Node.JS - Blurring the Line Between Client and Server”;$(this).attr(“title”, title);$(this).data({

font: ‘Segoe UI’, size: ‘30pt’, maxLines: ‘3 lines max’

});

Page 2: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Agenda• Why Node.JS?

o Why yet another server framework?• What is it?

o Asynchronous IO and the Evented Model• Hands On

o Let’s write some codeo How to nodeo Package, frameworks and toolso Latest features

• Q&A

Page 3: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

JavaScript on the ServerPros

• It’s JavaScript – it’s the best!• It’s fast and easy to scale• One language to rule them

allo Share code across

client/servero Never write serialization

code again – it’s all JSON• Never debug multithreaded

code again

• More?

Cons• It’s JavaScript – is it even a

real language?• Async programming – can

be unfamiliar and hard• Nested callback hell• Single process doesn’t

scale across cores

• More?

Page 4: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

ORIGINSWhy yet another server framework?

Page 5: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Evolution of Socket Servers• In the beginning was CGI

o A new process per request• Worker Pool Model

o Dispatch requests to persistent worker pool• To infinity and beyond

o The C10k problemo The race for high throughput and low latency

Page 6: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Thread Pool Model

responsesrequest queue

thread poolthread 1

thread 2

thread 3

thread 4

thread n

concurrency = # threads

Page 7: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Worker Thread Efficiency

wait… wait… wait…

route, parse requestform db query

parse db resultform web service query

process results

form response

db query web servicequery

log to disk

wait… wait… wait…

wait… wait… wait…wait… wait… wait…

Page 8: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Relative I/O Latency

CPU cycles

L1 cache 3

L2 cache 14

RAM 250

disk 41 000 000

network 240 000 000

Relative

next room ~5m

across the street ~20m

next block ~400m

Earth circumference

distance to the Moon

Page 9: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

IS THERE A BETTER WAY?

Page 10: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Asynchronous I/O1. Start I/O and return (non-blocking)2. Perform other tasks3. When I/O completes, process the result

• Handle requests in a single thread• Popular examples: nginx, lighttpd

Page 11: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Node.JS in 5 words

Evented I/O for V8 JavaScript

Page 12: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Evented Model

eventqueue

eventloop

single-thread

user space

I/O done

network

file system

other

internalthread pool

Page 13: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Async Callbacks – Look Familiar?setTimeout(function() {    console.log("time's up")}, 1000); console.log('hello')

while (true) {}

Page 14: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

HANDS ONLet’s write some code

Page 15: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

“Hello, World!”var http = require('http') http.createServer(function(req, res) {     res.writeHead(200, {'Content-Type': 'text/plain'})    res.end("hello\n") }).listen(9090)

Page 16: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Static HTTP Servervar http = require('http')var fs = require('fs') http.createServer(function(req, res) {     fs.readFile('index.html', function(err, data) {        if (err) {            res.writeHead(500)            res.end()        } else {            res.end(data)        }    })}).listen(9090)

Page 17: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Let’s codeWriting a simple blog

Page 18: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Module System

base64.jsvar encoding = 'base64‘ // locals are private exports.toBase64 = function(s) {    return new Buffer(s).toString(encoding)}

app.jsvar b64 = require('./base64') var a = b64.toBase64('JQueryBulgaria')

Page 19: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Error Handling• Asynchronous Callbacks and Exceptions• Dude, where is my stack?• Cannot debug across event loop iterations

• Async callback error code convention• First callback parameter is error object

fs.readFile(path, function(err, file) { if (err) { // handle error } //...})

Page 20: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

“Do, or do not. There is no try.”

• Reconsider the conventional wisdom of exception handling• Exceptions are cleaner, more elegant and…

wrong

• Hidden control flow and Corrupt State• Just because you don’t see a code path doesn’t

mean it doesn’t exist

• New generation of languages shun exceptions (like Go)

Page 21: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Callback Hell – the Modern GOTO

Page 22: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

AvoidingThe Callback Pyramid of Doom

• Keep it shallow• Name your anonymous functions• Avoid nesting

• Use a functional programming helper module• async, underscore (both server and client)

• Other alternatives• Promises• Fibers

Page 23: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Web App Frameworks• Node.JS is powerful

o Full control over HTTP servero But most of the time you’ll use a web

framework• Web App Frameworks like ExpressJS

provide:o Routingo Body parsingo Session and Cookie Managemento Templatingo Static File Server, Logger and many more

Page 24: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

ExpressJS – Hit Countervar express = require('express')var app = express(); app.use(express.cookieParser());app.use(express.cookieSession({secret: "dG9wc2VjcmV0"})); app.use(function(req, res) {    var sess = req.session    sess.hits = sess.hits || 0    sess.hits++     res.json({ visits: sess.hits })}); app.listen(80)

Page 25: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Questions?

res.setHeader(“Content-Type”, “text/plain”)res.write(“[email protected]\n”)res.end(“Bye!”)

Page 26: var title = “ Node.JS - Blurring the Line               Between Client and Server ”;

Thanks to our Sponsors:Diamond Sponsor:

Gold Sponsors:

Swag Sponsors: Media Partners:

Technological Partners:

Silver Sponsors:

Bronze Partners: