Intro to NodeJS       Matthew Eernisse Toster Conference 2011-10-28             2001
Who am I?Matthew EernisseWork at Yammer@mde on Twitter
JavaScript at Yammer•   Browsers (yammer.com Web UI)•   Adobe AIR Desktop•   V8 in Rails via TheRubyRacer•   NodeJS
NodeJS:“Evented I/O for V8 JavaScript”         http://nodejs.org/
Hello, NodeJSvar http = require(http);http.createServer(function (req, res) { res.writeHead(200,    {Content-Type: text/pl...
Server JS
•            History of SSJS    Netscape Enterprise Server (OG SSJS)•   Microsoft IIS•   Helma (now RingoJS)•   Whitebeam•...
Why NodeJS now?• Steve Yegge’s NBL post, 2007-02-10• Competition in JavaScript  interpreters• Simple, POSIX API• Non-block...
What is NodeJS good for?• Lightweight, networked apps• Proxies with embedded logic• Streaming data• System scripting• Even...
NodeJS is not good at complex   database-backed Web         applications.     You can use Rails.
Geddy Web framework:https://github.com/mde/geddy
•     NodeJS at Yammer     Development proxy•     Jake for build and test    (https://github.com/mde/jake)•    Upload serv...
Jake build tool             •     https://github.com/mde/jake•   Similar to Make or Rake•   Tasks, prerequisites•   File t...
desc(This is the default task.);task(default, function () { console.log(This is the default task.); console.dir(arguments)...
desc(This is an asynchronous task.);task(async, function () { setTimeout(function () {   console.log(Hooray!);   complete(...
var fs = require(fs) , pkg = JSON.parse(       fs.readFileSync(package.json).toString()) , version = pkg.versionvar t = ne...
Remote upload service•    Minimal v1 in prod, Nov. 2010•    Redis, CORS XHR-push or JSONP for upload-progress    reporting...
Realtime, collaborative      doc-editing service•   In beta Oct. 21, 2011 (last week)•   NodeJS, Socket.io, PostgreSQL•   ...
Coding JS for Node
Awesome:JavaScript is simple and     super-flexible
Horrible:JavaScript is simple and     super-flexible
Asynchronous code•   Even shelling out is async?•   “1, 3, 2, go!” development•   Evented and callback-based control-flow•...
1, 3, 2, go!var asyncFun = function () { console.log(1); setTimeout(function () {   console.log(3); }, 0); console.log(2);...
Sync fetch-and-updatevar fetchAndUpdate = function (params) { var items = db.fetch(someQuery); for (var i = 0, ii = items....
Async fetch-and-updatevar fetchAndUpdate = function (params, callback) { db.fetch(someQuery, function (items) {   var coun...
Is this familiar?jQuery.ajax({ url: /foo/bar.json, success: function () {    alert(yay!); }});jQuery(#foo).bind(click, fun...
Async patterns and libs•   Queue•   Promise/deferred•   In-flight registry
Queuevar asyncQueueHandler = function (items,   handler, callback) { var queue = items.slice()   , handleNextItem = functi...
Promisevar p = new yammer.util.Promise();p.when(foo, bar, baz).then(   function () { console.log(done!);});p.satisfy(foo);...
NodeJS in production
App dependencies•    Third-party modules still may change    rapidly•    Maintain forks, push back patches where    approp...
Debugging NodeJS•    Callbacks in global scope have no stack•    Assume you’re fucked•    Default condition is a preemptib...
FlightCheck         •    https://github.com/mde/flight_check•   Add items to in-flight registry•   Per-item timeout•   Con...
In-flight registryvar FlightCheck = require(flight_check).FlightCheck;var handler = function (req, resp) { var checker = n...
Visibility, metrics•   Measure everything•   Log everything•   https://github.com/mikejihbe/metrics
Ops•   Communicative, consultative dev•   Ask what is expected•   Play nicely with others
The future?•    JS interpreters will keep improving•     JS language will keep improving (see:    JS.next)•    NodeJS ecos...
Matthew Eernisse   http://twitter.com/mde Yammer Developer Centerhttp://developer.yammer.com/
Upcoming SlideShare
Loading in...5
×

Matthew Eernisse, NodeJs, .toster {webdev}

2,546

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,546
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
42
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Matthew Eernisse, NodeJs, .toster {webdev}

  1. 1. Intro to NodeJS Matthew Eernisse Toster Conference 2011-10-28 2001
  2. 2. Who am I?Matthew EernisseWork at Yammer@mde on Twitter
  3. 3. JavaScript at Yammer• Browsers (yammer.com Web UI)• Adobe AIR Desktop• V8 in Rails via TheRubyRacer• NodeJS
  4. 4. NodeJS:“Evented I/O for V8 JavaScript” http://nodejs.org/
  5. 5. Hello, NodeJSvar http = require(http);http.createServer(function (req, res) { res.writeHead(200, {Content-Type: text/plain}); res.end(Hello Worldn);}).listen(1337, "127.0.0.1");console.log( Server running at http://127.0.0.1:1337/);
  6. 6. Server JS
  7. 7. • History of SSJS Netscape Enterprise Server (OG SSJS)• Microsoft IIS• Helma (now RingoJS)• Whitebeam• Zimki• Jaxer• Perservere• Nitro• Google App Engine• CouchDB• NodeJS
  8. 8. Why NodeJS now?• Steve Yegge’s NBL post, 2007-02-10• Competition in JavaScript interpreters• Simple, POSIX API• Non-blocking from the ground up; so are the libraries
  9. 9. What is NodeJS good for?• Lightweight, networked apps• Proxies with embedded logic• Streaming data• System scripting• Evented realtime apps
  10. 10. NodeJS is not good at complex database-backed Web applications. You can use Rails.
  11. 11. Geddy Web framework:https://github.com/mde/geddy
  12. 12. • NodeJS at Yammer Development proxy• Jake for build and test (https://github.com/mde/jake)• Upload service for files and images (Geddy v0.2)• Browserless tests with FooUnit (https://github.com/foobarfighter/foounit)• Realtime, collaborative document-editing service
  13. 13. Jake build tool • https://github.com/mde/jake• Similar to Make or Rake• Tasks, prerequisites• File tasks, directory tasks• Namespaces• PackageTasks• Async task execution• Just executable JavaScript
  14. 14. desc(This is the default task.);task(default, function () { console.log(This is the default task.); console.dir(arguments);});namespace(foo, function () { desc(This the foo:bar task); task(bar, function () { console.log(doing foo:bar task); console.dir(arguments); });desc(This the foo:baz task);task(baz, [default, foo:bar], function () { console.log(doing foo:baz task); console.dir(arguments);});});
  15. 15. desc(This is an asynchronous task.);task(async, function () { setTimeout(function () { console.log(Hooray!); complete(); }, 1000);}, true);desc(Calls the foo:bar task and its dependencies.);task(invokeFooBar, function () { // Calls foo:bar and its deps jake.Task[foo:bar].invoke(); // Does nothing jake.Task[foo:bar].invoke(); // Only re-runs foo:bar, but not its dependencies jake.Task[foo:bar].reenable(); jake.Task[foo:bar].invoke();});
  16. 16. var fs = require(fs) , pkg = JSON.parse( fs.readFileSync(package.json).toString()) , version = pkg.versionvar t = new jake.PackageTask(jake, v + version, function () { var fileList = [ Makefile , Jakefile , README.md , package.json , lib/* , bin/* , tests/* ]; this.packageFiles.include(fileList); this.needTarGz = true; this.needTarBz2 = true;});
  17. 17. Remote upload service• Minimal v1 in prod, Nov. 2010• Redis, CORS XHR-push or JSONP for upload-progress reporting• Onboard thumbnailing, remote services for video and document post-processing• Three-machine cluster, not under a heavy load• Large file sizes (e.g., 1.5GB)
  18. 18. Realtime, collaborative doc-editing service• In beta Oct. 21, 2011 (last week)• NodeJS, Socket.io, PostgreSQL• No production metrics yet for perf/scalability
  19. 19. Coding JS for Node
  20. 20. Awesome:JavaScript is simple and super-flexible
  21. 21. Horrible:JavaScript is simple and super-flexible
  22. 22. Asynchronous code• Even shelling out is async?• “1, 3, 2, go!” development• Evented and callback-based control-flow• A familiar model?• Async patterns and libraries
  23. 23. 1, 3, 2, go!var asyncFun = function () { console.log(1); setTimeout(function () { console.log(3); }, 0); console.log(2); console.log(go!);};
  24. 24. Sync fetch-and-updatevar fetchAndUpdate = function (params) { var items = db.fetch(someQuery); for (var i = 0, ii = items.length; i++) { item.update(params); } return true;};
  25. 25. Async fetch-and-updatevar fetchAndUpdate = function (params, callback) { db.fetch(someQuery, function (items) { var count = 0; for (var i = 0, ii = items.length; i++) { item.update(params, function () { count++; if (count == ii) { callback(true); } }); } });};
  26. 26. Is this familiar?jQuery.ajax({ url: /foo/bar.json, success: function () { alert(yay!); }});jQuery(#foo).bind(click, function (e) { // Do some stuff});
  27. 27. Async patterns and libs• Queue• Promise/deferred• In-flight registry
  28. 28. Queuevar asyncQueueHandler = function (items, handler, callback) { var queue = items.slice() , handleNextItem = function () { var next = queue.pop(); if (next) { handler(next, function () { handleNextItem(); }); } else { callback(); } }; handleNextItem();};
  29. 29. Promisevar p = new yammer.util.Promise();p.when(foo, bar, baz).then( function () { console.log(done!);});p.satisfy(foo);p.satisfy(bar);p.satisfy(baz);p.then(function () { console.log(still done!);});
  30. 30. NodeJS in production
  31. 31. App dependencies• Third-party modules still may change rapidly• Maintain forks, push back patches where appropriate
  32. 32. Debugging NodeJS• Callbacks in global scope have no stack• Assume you’re fucked• Default condition is a preemptible error• In-flight registry with uncaughtException handler
  33. 33. FlightCheck • https://github.com/mde/flight_check• Add items to in-flight registry• Per-item timeout• Configurable polling-interval• Define a timeout-handler
  34. 34. In-flight registryvar FlightCheck = require(flight_check).FlightCheck;var handler = function (req, resp) { var checker = new FlightCheck(function (key) { resp.writeHead(500); resp.end(Oops, something bad happened.); }); checker.add(foo, 10000); doFoo(req, function (result) { if (result.ok) { checker.clear(foo); // Do some other stuff resp.writeHead(200); resp.end(Hooray!); } });};process.on(uncaughtException, function (err) { // Do some kind of logging});
  35. 35. Visibility, metrics• Measure everything• Log everything• https://github.com/mikejihbe/metrics
  36. 36. Ops• Communicative, consultative dev• Ask what is expected• Play nicely with others
  37. 37. The future?• JS interpreters will keep improving• JS language will keep improving (see: JS.next)• NodeJS ecosystem will grow and mature• Try NodeJS, you’ll like it
  38. 38. Matthew Eernisse http://twitter.com/mde Yammer Developer Centerhttp://developer.yammer.com/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×