node.js test
TRANSCRIPT
Node.js
Thomas AmslerJune 14, 2012
GDG Sacramento
Node
●Created by Ryan Dahl in 2009. First presented at JSConf EU.
●Node is a platform built on Chrome's V8 JavaScript runtime for easily building fast, scalable network applications.
●Node uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.
●Node is for data-intensive real-time applications that run across distributed devices.
Node ...
●Server Side JavaScript●Built on Google's V8 Runtime●Non-blocking I/O (Asynchronous)●Evented (Event Loop)●Module System●Native on Linux, Mac OS X, Windows●Enables Real-time Web●It's all about LATENCY
History
●Netscape LiveWire (1996)●Rhino (1997) [for Java]●Aptana Jaxer (2008)●RingoJS [for Java]●Narwhale●Node.js (2009)●IronJS [for .NET]
Synchronous vs Asynchronous
I/O is not free
●L1: 3 cycles●L2: 14 cycles●RAM: 250 cycles●DISK: 41,000,000 cycles●NETWORK: 240,000,000 cycles
http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait
Blocking I/O (Sync)
<?phpecho "Hello";file_get_contents("/path/to/file");echo " World";
?>
Threads
●Each Thread takes memory●Threads introduce additional complexity
oRace conditionsoDeadlockoAdditional setup overheado ...
Non-blocking I/O (Async)
console.log('Hello');fs.readFile('/path/to/file', function(err, data) { // do something ...});console.log(' World');
Event Loop
●Efficient (if used asynchronously)●Only one stack●No memory overhead●Simpler model (no deadlocks, no race
conditions ...)
The C10K Problem
●C10K refers to the problem of optimizing a web server to handle a large number of clients at the same time.
●C = CONCURRENT●Apache uses one thread per connection●NGINX doesn't use multiple threads but
instead uses an event loop●NGINX and Node.js are similar with respect
to utilizing an event loop to achieve high concurrency on low latency
The C10K Problem ...
●C = Concurrent●http://www.kegel.com/c10k.html
http://blog.webfaction.com/a-little-holiday-present
The C10K Problem ...●Using one thread per connection is memory-
bound
http://blog.webfaction.com/a-little-holiday-present
... back to Node.js ...
Why JavaScript?
●JS devs already think asynchronously (Browsers + AJAX)
●JS is fast and getting faster●JS quickly is becoming a compilation targeto https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-c
ompile-to-JS
●Code sharing between the client and servero Maybe common libs ...
●JSON native and full application stacko MongoDB, Node.js, Angular.js
Google's V8 JavaScript Engine
●V8 is a JavaScript engine specifically designed for fast execution of large JavaScript applications
●Used in Google's Chrome browser●Written in C++●Fast property access●Dynamic machine code generation●Efficient garbage collection● https://developers.google.com/v8/● http://blog.chromium.org/2012/05/better-code-optimization-decisions-for.ht
ml
The Node.js Darkside●Still relatively young●Bad idea to do raw computation in an event
loop. Use node-webworker●Debugging is hard but will significantly
improve in future versions●Callbacks (not really an issue)
doA( argA, function() {doB(argB, function() {
doC(argC, function() {// etc.
});});
});
Node Package Manager (NPM)
●NPM is a package manager for node. You can use it to install and publish your node programs. It manages dependencies and does other cool stuff.
●http://npmjs.org/●http://search.npmjs.org/o Expresso Requesto Socket.io (LearnBoost)o Jadeo ... 10k + more ...
Node Package Manager (NPM) ...
Node Core(V8, libev, libeio, ...)
Core Modules(http, net, ...)
Community-created Modules(express, socket.io, restify, ...)
Let's Node
●Read Evaluate Print Loop (REPL)oSimilar to Perl, Python, and Ruby
●It's great for testing out and learning about Node.js
●Since Node.js uses V8, Node REPL is an ideal place to easily try out and learn JavaScript
●DEMO
First Node Server
var http = require('http');var s = http.createServer( function(req, res) {
res.writeHead( 200, { 'Content-Type' : 'text/plain' } );res.end('Hello World\n');
});s.listen(8080);
● curl http://localhost:8080/● curl -i -X GET http://localhost:8080/● DEMO
Load Test & Profiling
●Using Apache Bench (ab) for Simple Load Testingoab -n 200 -c 200 http://127.0.0.1:8080/
●Profiling Node.jso http://dtrace.org/blogs/dap/2012/04/25/profiling-node-js/
Node.js Information
●APIohttp://nodejs.org/api
●SRCohttps://github.com/joyent/node
●How To Nodeohttp://howtonode.org
●StackOverflowohttp://stackoverflow.com/questions/tagged/node.js
●Projects & Companies using Node.jsohttp://goo.gl/Wcqtj
Other Resources
●Introduction to Node.js with Ryan Dahlohttp://youtu.be/jo_B4LTHi3I
●The Node Beginner Bookohttp://www.nodebeginner.org
●Ryan Dahl - History of Node.jsohttp://youtu.be/SAc0vQCC6UQ
●What is Node? (Free)ohttp://shop.oreilly.com/product/0636920021506.do
●Ryan Dahl's 2009 slidesohttp://s3.amazonaws.com/four.livejournal/20091117/
jsconf.pdf