Matthew Eernisse, NodeJs, .toster {webdev}

2,887 views

Published on

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

No Downloads
Views
Total views
2,887
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
43
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/

×