POPBehind the sense
About meBen LinCo-founder at WOOMOO INC.A full time entrepreneur & JavaScript loverFall in love with node.js on Jun 2011  ...
About me   COKE - Full stack node.js MVC framework   Vodka - Functional testing framework   Thunder - The lightning fast t...
Agenda         1. Software architecture         2. Frameworks & Libraries         3. Application stack         4. Packages...
Software architecture
Software architecture     Home brewed node.js MVC framework - COKE              Why node.js?             It’s fast and eas...
Software architectureRestful router for api & web server          module.exports = function ( map ){            map.get( a...
Software architectureValidation   make sure all the arguments are correct before get into controllers                  var...
Software architectureController Only do data exchange & flow control                       module.exports = Application.ext...
Software architectureModelHandel business logic and model relations, we add a wrapper on mongoose the ODM.     module.expo...
Software architectureViewWe use the fastest template engine thunder ( home brewed )            <!DOCTYPE html>            ...
Software architectureLibrariesExtract reusable codes that is not relevant to model
Scaling node.js
Scaling node.jsStart small with built-in static server, node.js app & database all on the same server.
Scaling node.jsUse nginx as static server for better performance.
Scaling node.jsUse nginx as as proxy server as well to load balance requests.The number of node.js app instance depends on...
Scaling node.jsSplit static files to different server for easier maintenance.
Scaling node.jsUse aws S3 for easier setup and maintenance.
Scaling node.jsSplit database to another server. Make the node.js app server an unit.
Scaling node.jsAdd a load balancer, add more app unit as the site scales up.
Scaling node.jsAdd replica set if the database hits its limit.
Scaling node.jsAdd CDN for static files for cross reign performance.
Scaling node.jsSplit app to difference services as it scales up. Previous scaling steps apply to those services too.
Deployment
DeploymentWith ssh, git; The server must stop during deployment.
DeploymentWith ssh, git; 0 downtime deployment is possible since we have more than 1 instance( repo ).
DeploymentWith ssh, git; Split static file makes it easier to deploy with multi instance( repo ) app.
DeploymentDeploying with multi machine it’s better to use image files on aws ec2.
THE END Thanks
QUESTIONS?
Upcoming SlideShare
Loading in …5
×

Heroku pop-behind-the-sense

771 views

Published on

lightning talk at heroku

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
771
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Heroku pop-behind-the-sense

  1. 1. POPBehind the sense
  2. 2. About meBen LinCo-founder at WOOMOO INC.A full time entrepreneur & JavaScript loverFall in love with node.js on Jun 2011 dreamerslab.com ben@dreamerslab.com twitter.com/dreamerslab github.com/dreamerslab
  3. 3. About me COKE - Full stack node.js MVC framework Vodka - Functional testing framework Thunder - The lightning fast template engine And a lot more on https://github.com/dreamerslab
  4. 4. Agenda 1. Software architecture 2. Frameworks & Libraries 3. Application stack 4. Packages 5. Scaling node.js 6. Deployment 7. Q & A
  5. 5. Software architecture
  6. 6. Software architecture Home brewed node.js MVC framework - COKE Why node.js? It’s fast and easy to scale horizontally
  7. 7. 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 ...... }); };
  8. 8. Software architectureValidation make sure all the arguments are correct before get into controllers 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 ) ) };
  9. 9. Software architectureController Only do data exchange & flow control 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 ); }); } });
  10. 10. Software architectureModelHandel business logic and model relations, we add a wrapper on mongoose the ODM. 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 ){ ... } } };
  11. 11. Software architectureViewWe use the fastest template engine thunder ( home brewed ) <!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>
  12. 12. Software architectureLibrariesExtract reusable codes that is not relevant to model
  13. 13. Scaling node.js
  14. 14. Scaling node.jsStart small with built-in static server, node.js app & database all on the same server.
  15. 15. Scaling node.jsUse nginx as static server for better performance.
  16. 16. Scaling node.jsUse 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.
  17. 17. Scaling node.jsSplit static files to different server for easier maintenance.
  18. 18. Scaling node.jsUse aws S3 for easier setup and maintenance.
  19. 19. Scaling node.jsSplit database to another server. Make the node.js app server an unit.
  20. 20. Scaling node.jsAdd a load balancer, add more app unit as the site scales up.
  21. 21. Scaling node.jsAdd replica set if the database hits its limit.
  22. 22. Scaling node.jsAdd CDN for static files for cross reign performance.
  23. 23. Scaling node.jsSplit app to difference services as it scales up. Previous scaling steps apply to those services too.
  24. 24. Deployment
  25. 25. DeploymentWith ssh, git; The server must stop during deployment.
  26. 26. DeploymentWith ssh, git; 0 downtime deployment is possible since we have more than 1 instance( repo ).
  27. 27. DeploymentWith ssh, git; Split static file makes it easier to deploy with multi instance( repo ) app.
  28. 28. DeploymentDeploying with multi machine it’s better to use image files on aws ec2.
  29. 29. THE END Thanks
  30. 30. QUESTIONS?

×