Download presentation
Presentation is loading. Please wait.
Published byDevin Stamer Modified over 10 years ago
1
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’ });
2
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 code o How to node o Package, frameworks and tools o Latest features Q&A
3
JavaScript on the Server Pros It’s JavaScript – it’s the best! It’s fast and easy to scale One language to rule them all o Share code across client/server o 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?
4
ORIGINS Why yet another server framework?
5
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 problem o The race for high throughput and low latency
6
Thread Pool Model responsesrequest queue thread pool thread 1 thread 2 thread 3 thread 4 thread n concurrency = # threads
7
Worker Thread Efficiency wait… route, parse request form db query parse db result form web service query process results form response db queryweb service query log to disk wait…
8
Relative I/O Latency CPU cycles L1 cache3 L2 cache14 RAM250 disk41 000 000 network240 000 000 Relative next room ~5m across the street ~20m next block ~400m Earth circumference distance to the Moon
9
IS THERE A BETTER WAY?
10
Asynchronous I/O 1.Start I/O and return (non-blocking) 2.Perform other tasks 3.When I/O completes, process the result Handle requests in a single thread Popular examples: nginx, lighttpd
11
Node.JS in 5 words Evented I/O for V8 JavaScript
12
Evented Model event queue event loop single-thread user space I/O done network file system other internal thread pool
13
Async Callbacks – Look Familiar? setTimeout(function() { console.log("time's up") }, 1000); console.log('hello') while (true) {}
14
HANDS ON Let’s write some code
15
“Hello, World!” var http = require('http') http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}) res.end("hello\n") }).listen(9090)
16
Static HTTP Server var 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)
17
Let’s code Writing a simple blog
18
Module System base64.js var encoding = 'base64‘ // locals are private exports.toBase64 = function(s) { return new Buffer(s).toString(encoding) } app.js var b64 = require('./base64') var a = b64.toBase64('JQueryBulgaria')
19
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 } //... })
20
“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)
21
Callback Hell – the Modern GOTO
22
Avoiding The 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
23
Web App Frameworks Node.JS is powerful o Full control over HTTP server o But most of the time you’ll use a web framework Web App Frameworks like ExpressJS provide: o Routing o Body parsing o Session and Cookie Management o Templating o Static File Server, Logger and many more
24
ExpressJS – Hit Counter var 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)
25
Questions? res.setHeader(“Content-Type”, “text/plain”) res.write(“valentin.kostadinov@gmail.com\n”) res.end(“Bye!”)
26
Thanks to our Sponsors: Diamond Sponsor: Gold Sponsors: Swag Sponsors:Media Partners: Technological Partners: Silver Sponsors: Bronze Partners:
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.