nodejs and javascript- everywheregotocon.com/dl/jaoo-melbourne-2011/slides/mde_yow... ·...

37
NodeJS and JavaScript- everywhere Matthew Eernisse YOW Conference: December 2011 Tuesday, December 6, 11

Upload: dodat

Post on 16-Sep-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

NodeJS and JavaScript-everywhere

Matthew EernisseYOW Conference: December 2011

Tuesday, December 6, 11

Who am I?

Matthew EernisseWork at Yammer@mde on Twitter

Tuesday, December 6, 11

What is “JavaScript- everywhere”?

Tuesday, December 6, 11

A list of stuff• Ruby

• JavaScript

• Scala

• Java

• C#

• Rails

• NodeJS

• PostgreSQL

• Memcache

• Riak

• Redis

• BDB

• Vertica

• R

Tuesday, December 6, 11

JavaScript at Yammer• Browsers YamJS, a.k.a.,“YamJuice”

• Adobe AIR Desktop

• V8 in Rails via TheRubyRacer

• NodeJS

Tuesday, December 6, 11

Server JS

Tuesday, December 6, 11

• Netscape Enterprise Server (OG SSJS)

• Microsoft IIS

• Helma (now RingoJS)

• Whitebeam

• Zimki

• Jaxer

• Perservere

• Nitro

• Google App Engine

• CouchDB

• NodeJS

SSJS

Tuesday, December 6, 11

Why NodeJS?

• Death of Netscape

• Open source

• Yegge’s NBL, 2007-02-10

• Competition

• V8

Tuesday, December 6, 11

NodeJS:“Evented I/O for V8 JavaScript”

http://nodejs.org/

Tuesday, December 6, 11

var http = require('http');http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');}).listen(1337, "127.0.0.1");console.log('Server running at ' + ' http://127.0.0.1:1337/');

Hello, NodeJS

Tuesday, December 6, 11

What can you do with Node?

Tuesday, December 6, 11

EventEmitterReadable/WritableStream

Callbacks

Tuesday, December 6, 11

Jake build toolhttps://github.com/mde/jake

• Tasks, prerequisites

• File tasks, directory tasks

• Namespaces

• PackageTasks

• Just executable JavaScript

• Async task execution (shell commands)

Tuesday, December 6, 11

namespace('foo', function () { desc('This a sychronous task'); task('bar', function () { console.log('howdy'); });

desc('This an asychronous task'); task('baz', function () { require('child_process').exec('ls -l', function (err, stdout, stderr) { console.log(stdout); complete(); }); }, {async: true});

});

Tuesday, December 6, 11

Geddy Web framework:https://github.com/mde/geddy

Tuesday, December 6, 11

NodeJS at Yammer

• Upload service for files and images

• Realtime, collaborative document-editing feature

• Another, early-alpha service for mobile Web

Tuesday, December 6, 11

Remote upload service

• Minimal v1 in prod, Nov. 2010

• Onboard thumbnailing, remote services for video and document post-processing

• Redis, CORS XHR-push or JSONP for upload-progress reporting

Tuesday, December 6, 11

Realtime, collaborative documents feature

• In beta Oct. 21, 2011

• EtherPad Lite (https://github.com/Pita/etherpad-lite): NodeJS, Socket.io, PostgreSQL

Tuesday, December 6, 11

Coding JS for Node

Tuesday, December 6, 11

Flexibility

Tuesday, December 6, 11

• Even shelling out is async?

• “Inside-out” execution

• Evented and callback-based control-flow

Async horror

Tuesday, December 6, 11

var fetchAndUpdate = function (params) { var items = db.fetch(someQuery); for (var i = 0, ii = items.length; i < ii; i++) { item.update(params); } return true;};

Sync fetch-and-update

Tuesday, December 6, 11

var fetchAndUpdate = function (params, callback) { db.fetch(someQuery, function (items) { var count = 0; for (var i = 0, ii = items.length; i < ii; i++) { item.update(params, function () { count++; if (count == ii) { callback(true); } }); } });};

Async fetch-and-update

Tuesday, December 6, 11

jQuery.ajax({ url: '/foo/bar.json', success: function () { alert('yay!'); }});

jQuery('#foo').bind('click', function (e) { // Do some stuff});

Is this familiar?

Tuesday, December 6, 11

Async patterns and libs

• Async queue

• Promise/deferred/future/eventual

Tuesday, December 6, 11

var 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!');});

Promise

Tuesday, December 6, 11

Don’t overdo it.

Tuesday, December 6, 11

NodeJS in production

Tuesday, December 6, 11

• NPM is awesome

• Third-party modules still may change rapidly

• Maintain forks, push back patches where appropriate

App dependencies

Tuesday, December 6, 11

Assume you’re fuckedCallbacks in global scope

have no stack

Tuesday, December 6, 11

• uncaughtException handler

• Preemptible timeout-errors

• Timeout registry

Tuesday, December 6, 11

Timeout registry• Entries in an object with keys

• Per-item timeout

• Configurable polling-interval

• Define a timeout-handler

Tuesday, December 6, 11

var TimeoutReg = require('timeout_registry').TimeoutReg , handler = function (req, resp) { var registry = new TimeoutReg(function (key) {

resp.writeHead(500); resp.end('Oops, something bad happened.'); }); registry('foo', 10000); performFoo(req, function (result) { if (result.ok) { registry.clear('foo'); // Do some other stuff

resp.writeHead(200); resp.end('Hooray!'); } });};

process.on('uncaughtException', function (err) { // Do some kind of logging});

Timeout registry

Tuesday, December 6, 11

• Measure everything

• Log everything

• https://github.com/mikejihbe/metrics

Visibility, metrics

Tuesday, December 6, 11

• Communicative, consultative dev

• Ask what is expected

• Be transparent

• Play nicely with others

Ops

Tuesday, December 6, 11

Try it; you’ll like it.

Tuesday, December 6, 11

Matthew Eernissehttp://twitter.com/mde

Yammer Developer Centerhttp://developer.yammer.com/

Tuesday, December 6, 11