51
Asynchronou s Architectur es Mark Ethan Trostler [email protected] @zzoass

Multi-Process JavaScript Architectures

Embed Size (px)

DESCRIPTION

Exploiting Multi-Process Architectures using JavaScript

Citation preview

Page 1: Multi-Process JavaScript Architectures

Asynchronous

Architectures

Mark Ethan Trostler [email protected]

@zzoass

Page 2: Multi-Process JavaScript Architectures
Page 3: Multi-Process JavaScript Architectures
Page 4: Multi-Process JavaScript Architectures
Page 5: Multi-Process JavaScript Architectures
Page 6: Multi-Process JavaScript Architectures
Page 7: Multi-Process JavaScript Architectures
Page 8: Multi-Process JavaScript Architectures
Page 9: Multi-Process JavaScript Architectures
Page 10: Multi-Process JavaScript Architectures
Page 11: Multi-Process JavaScript Architectures
Page 12: Multi-Process JavaScript Architectures

Motivation

Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.

Controlling complexity is the essence of computer programming

The only way to write complex software that won't fall on its face is to hold its global complexity down — to build it out of simple parts connected by well-defined interfaces, so that most problems are local and you can have some hope of upgrading a part without breaking the whole.

Page 13: Multi-Process JavaScript Architectures

The Goal Bite sized

Text-based communication

Independent

KISS

Naturally private methods

Naturally loosely coupled

Fail gracefully

Maximize processor

Page 14: Multi-Process JavaScript Architectures
Page 15: Multi-Process JavaScript Architectures

Code Complexity

#1 indicator of bugs: code size ( > 9300 chars)

In the eye of the beholder: the Co-Worker Test

Dependency count - coupling

Page 16: Multi-Process JavaScript Architectures

Dependencies

Required for object operation

Lots of dependencies make code complex

Long chains of dependencies make code complex

More code loaded locally – more chance for something to go wrong

* Load JS, ‘require’

Minimize Dependencies!

Page 17: Multi-Process JavaScript Architectures

Coupling

What do you do with a dependency?? Instantiate it? Call methods? Access properties? Change shared global state? Alter all of them (prototype)?

Keep Coupling Loose!

Page 18: Multi-Process JavaScript Architectures

Application?Applications are message passing systems with a bag of objects in the middle with input and output at either ends.

Object3

Object2

Object1

Page 19: Multi-Process JavaScript Architectures

Current Application Paradigms

Method based APIs Tight coupling adds complexity

Remote interfaces Non-local – sync or async Local interface to remote object (Model)

Object-based callbacks Eventing/Callbacks require dependent object to

be local

Page 20: Multi-Process JavaScript Architectures

Current: Method-based API

Page 21: Multi-Process JavaScript Architectures

Current: Method-based API

Maximizes coupling

Easy to add dependencies

Synchronous across objects (typically) – blocks caller

Local

Understood

Page 22: Multi-Process JavaScript Architectures

Method / Event Hybrid

Local reference to object

Synchronous emitter

Asynchronous listener

Same process / memory space

Same coupling

Same dependencies

Page 23: Multi-Process JavaScript Architectures

Pure Event API

Local reference

Same dependency / Same coupling

Return values?

Semantics?

Not as understood

Something still wrong…

Page 24: Multi-Process JavaScript Architectures

A Different App Paradigm

Page 25: Multi-Process JavaScript Architectures

Pure Event with Hub

Asynchronous emitter

Asynchronous listener

NO local reference

Shared nothing

Loose coupling

Function callbacks

Page 26: Multi-Process JavaScript Architectures

Central Hub

Independent modules cannot find each other

All connect to central hub

Hub unicast/broadcast events/responses

Session handling

Authorization services

Event registration

No local references

Services run anywhere (no same-domain)

Page 27: Multi-Process JavaScript Architectures

What Does It Look Like?

Listeners on event name, get an object and an optional callback

Emitters send event name, data object and an optional callback

Callback function expects (error, response) where error is either an object or string or null and response is an object (NodeJS standard)

Page 28: Multi-Process JavaScript Architectures

Emitter

hub.fire('user:getProfile', function(err, userObject) {

if (!err) {

Y.one(‘#user’).set(‘innerHTML’, JSON.parse(userObject));

} else {

hub.fire(‘ui:error’, { msg: err} );

}

});

Page 29: Multi-Process JavaScript Architectures

Emitter / Listener hub.on('user:getProfile', function(obj, callback) {

hub.emit('session:get', { 'eventHub:session': obj['eventHub:session'] }, function(err, session) {

if (err) {

callback(err);

} else {

redis.hgetall('user:' + session.user, callback);

}

});

});

Page 30: Multi-Process JavaScript Architectures

Listener var redis = require('redis').createClient();

hub.on('session:get', function(obj, callback) {

var session = obj['eventHub:session'];

if (session) {

redis.hgetall('session:' + session, callback);

} else {

callback('No session');

}

});

Page 31: Multi-Process JavaScript Architectures

Typical Web Server/App

HTTP Serve

r

Controller / Router

Session

Models

Authentication

Authorization

ThreadingStatic content

DB connectors

540+ apache modules

Servlet container

Sink/Source ALL communication

Browser

Page 32: Multi-Process JavaScript Architectures

Webserver??

HTTP server is just a module

Serves only static content

No entangled business logic

No entangled routes

Do not need to restart on changes to other modules

Page 33: Multi-Process JavaScript Architectures

EventHub Architecture

Event Hub

HTTP Server

Session

DB

Browser View

Browser

Module

User Module

Page 34: Multi-Process JavaScript Architectures

Unicast and Broadbast

Both kinds!

Event sent to one listener or many

Still must register for the event for broadcast!

Hub can return error if no one is listening

Page 35: Multi-Process JavaScript Architectures

Module

Event Hub

Module NEW

UNICAST REGISTER

EVENT FLOW

UNICAST REGISTER

DONE EVENT

FINAL FLOW / SHUTDOWN

EVENT FLOW

No Dropped Events

Page 36: Multi-Process JavaScript Architectures

Wither MVC?

Page 37: Multi-Process JavaScript Architectures

Processes vs. Threads

PROCESSES EASY

• IPC handled by hub

• Independent modules

• Deterministic• Straightforward

testing• DB ACID

THREADS HARD

• Non-deterministic• Synchronization

issues• Deadlock• Testing dicey• Syntactic cruft

Page 38: Multi-Process JavaScript Architectures

Performance

Methods

• FASTer• synchronous

Events

• SLOWer• asynchronou

s

Page 39: Multi-Process JavaScript Architectures

Scaling Web Apps

Webservers behind VIPs / load balacners

Load balancers affinity / sticky sessions

Serialize session data

Page 40: Multi-Process JavaScript Architectures

Scaling Event-based Apps

Multiple hubs with replicated modules

Clients specify hub – dynamic or static

Broadcast events – bring up more modules

Page 41: Multi-Process JavaScript Architectures

Complexity

Method

• Dependencies• Straightforwar

d• Internal

complexity• Bigger pieces

Event

• Self-contained• More moving

pieces• External

complexity• Smaller pieces

Page 42: Multi-Process JavaScript Architectures

Testability

Methods

• Coupled dependencies

• Threads Non-deterministic

Events

• Isolatable• Loosely

coupled• Processes

deterministic

Page 43: Multi-Process JavaScript Architectures

Deploy

Method

• Big Bang• No

incremental changes

• Simple

Events

• Only incremental changes

• Complex

Page 44: Multi-Process JavaScript Architectures

Third Party Options

Method

• Import locally

• Hosted remotely

• Loaded locally

Event Hub

• Import locally

• Hosted remotely

• Global hosted remotely

• Not Loaded!

Page 45: Multi-Process JavaScript Architectures

FAILURE

Monolithic systems fail completely

Event-based systems fail incrementally Can route around failure Degrade gracefully

Page 46: Multi-Process JavaScript Architectures

The Goal

Bite sized

Text-based communication

Independent

KISS

Naturally private

Naturally loosely coupled

Fail gracefully

Page 47: Multi-Process JavaScript Architectures

Solves World Hunger?

Page 48: Multi-Process JavaScript Architectures

Theories

Actor Model

Hypervisors

Microkernels

Event hub analogy: Ethernet Hubs Switches Router

Page 49: Multi-Process JavaScript Architectures

EventHub

Built on socket.io

Hub serves JS

Server clients NodeJS

Browser clients YUI jQuery

Page 50: Multi-Process JavaScript Architectures

Practices

EventHub https://github.com/zzo/EventHub

Korus http://code.google.com/p/korus/

Akka http://akka.io

Netty http://www.jboss.org/netty/

Minix 3.2 http://www.minix3.org/

L4 http://www.l4hq.org/

Page 51: Multi-Process JavaScript Architectures