heroku pop-behind-the-sense

30
POP Behind the sense

Upload: ben-lin

Post on 17-May-2015

462 views

Category:

Documents


0 download

DESCRIPTION

lightning talk at heroku

TRANSCRIPT

Page 1: Heroku pop-behind-the-sense

POPBehind the sense

Page 2: Heroku pop-behind-the-sense

Ben Lin

Co-founder at WOOMOO INC.

A full time entrepreneur & JavaScript lover

Fall in love with node.js on Jun 2011

[email protected]

twitter.com/dreamerslabgithub.com/dreamerslab

About me

Page 3: Heroku pop-behind-the-sense

About me

COKE - Full stack node.js MVC framework

Vodka - Functional testing frameworkThunder - The lightning fast template engine

And a lot more on

https://github.com/dreamerslab

Page 4: Heroku pop-behind-the-sense

Agenda

1. Software architecture

2. Frameworks & Libraries

3. Application stack

4. Packages

5. Scaling node.js

6. Deployment

7. Q & A

Page 5: Heroku pop-behind-the-sense

Software architecture

Page 6: Heroku pop-behind-the-sense

Software architecture

Home brewed node.js MVC framework - COKE

Why node.js?

It’s fast and easy to scale horizontally

Page 7: Heroku pop-behind-the-sense

Software architectureRestful router for api & web server

module.exports = function ( map ){ map.get( 'api', 'api/home#index' ); map.namespace( 'api', function ( api ){ api.resources( 'users', { only : [ 'create', 'show', 'update', 'destroy' ] }, function ( users ){ users.get( 'projects/:id/full', 'user_projects#full' ); users.resources( 'user_projects', { path : 'projects', only : [ 'create', 'index', 'show', 'update', 'destroy' ] }); // more routes ...... });};

Page 8: Heroku pop-behind-the-sense

Software architecture

var form = require( 'express-form2' );var field = form.field;var r = require( '../regex' );

module.exports = {

validate_create : form( field( 'client_id' ).required().is( r.id, '01' ), field( 'mockup_id' ).required().is( r.id, '01' ), field( 'format' ).required().is( r.img, '014' ) ),

validate_index : form( field( 'mockup_id' ).required().is( r.id, '01' ) ),

validate_destroy : form( field( 'mockup_id' ).required().is( r.id, '01' ), field( 'id' ).required().is( r.id, '01' ) )};

make sure all the arguments are correct before get into controllersValidation

Page 9: Heroku pop-behind-the-sense

Software architectureOnly do data exchange & flow controlController

module.exports = Application.extend({

init : function ( before, after ){ before( this.is_authenticated ); before( this.validate_create ); before( this.has_file ); before( this.is_validate ); },

create : function ( req, res, next ){ var self = this;

ProjectImage.insert( req.form, next, function (){ self.forbidden( res ); }, function (){ self.frozen( res ); }, function ( img ){ self.created( res, img ); }); }});

Page 10: Heroku pop-behind-the-sense

Software architecture

Handel business logic and model relations, we add a wrapper on mongoose the ODM.

Model

module.exports = { virtuals : [ 'image' ], hooks : { pre : { save : [ common.mark_new ], remove : [ common.backup_to( 'BakMockupImage' ), hooks.remove_from_mockup ] }, post : { save : [ hooks.add_to_mockup, common.add_to_auth( 'images' )], remove : [ hooks.remove_from_s3 ] } }, statics : { insert : function ( args, next, forbidden, frozen, created ){ ... }, index : function ( args, next, no_content, forbidden, ok ){ .. }, destroy : function ( args, next, no_content, forbidden, frozen, deleted ){ ... } }, methods : { is_owner : function ( user_id ){ ... }, created : function (){ ... }, gen_url : function ( format ){ ... } }};

Page 11: Heroku pop-behind-the-sense

Software architecture

We use the fastest template engine thunder ( home brewed )

View

<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title><?= it.title ?></title> <meta name="keywords" content="<?= it.keywords || '' ?>" /> <meta name="description" content="<?= it.description || '' ?>" /> <!--[if lt IE 9]> <meta http-equiv="refresh" content="0; url=/no-ie"> <![endif]--> <?= it.css( it.styles ) ?> </head> <body> <? it.reset_asset_host(); ?> <?= it.body ?> <?= it.js( it.scripts ) ?> </body></html>

Page 12: Heroku pop-behind-the-sense

Software architecture

Extract reusable codes that is not relevant to model

Libraries

Page 13: Heroku pop-behind-the-sense

Scaling node.js

Page 14: Heroku pop-behind-the-sense

Start small with built-in static server, node.js app & database all on the same server.

Scaling node.js

Page 15: Heroku pop-behind-the-sense

Use nginx as static server for better performance.

Scaling node.js

Page 16: Heroku pop-behind-the-sense

Use nginx as as proxy server as well to load balance requests.

The number of node.js app instance depends on how many CPU cores on the machine.

Scaling node.js

Page 17: Heroku pop-behind-the-sense

Split static files to different server for easier maintenance.

Scaling node.js

Page 18: Heroku pop-behind-the-sense

Use aws S3 for easier setup and maintenance.

Scaling node.js

Page 19: Heroku pop-behind-the-sense

Split database to another server. Make the node.js app server an unit.

Scaling node.js

Page 20: Heroku pop-behind-the-sense

Add a load balancer, add more app unit as the site scales up.

Scaling node.js

Page 21: Heroku pop-behind-the-sense

Add replica set if the database hits its limit.

Scaling node.js

Page 22: Heroku pop-behind-the-sense

Add CDN for static files for cross reign performance.

Scaling node.js

Page 23: Heroku pop-behind-the-sense

Split app to difference services as it scales up. Previous scaling steps apply to those services too.

Scaling node.js

Page 24: Heroku pop-behind-the-sense

Deployment

Page 25: Heroku pop-behind-the-sense

With ssh, git; The server must stop during deployment.

Deployment

Page 26: Heroku pop-behind-the-sense

With ssh, git; 0 downtime deployment is possible since we have more than 1 instance( repo ).

Deployment

Page 27: Heroku pop-behind-the-sense

With ssh, git; Split static file makes it easier to deploy with multi instance( repo ) app.

Deployment

Page 28: Heroku pop-behind-the-sense

Deploying with multi machine it’s better to use image files on aws ec2.

Deployment

Page 29: Heroku pop-behind-the-sense

THE ENDThanks

Page 30: Heroku pop-behind-the-sense

QUESTIONS?