Scaling Rails With Torquebox Presented at JUDCon:2011 Boston
Upcoming SlideShare
Loading in...5
×
 

Scaling Rails With Torquebox Presented at JUDCon:2011 Boston

on

  • 4,677 views

 

Statistics

Views

Total Views
4,677
Slideshare-icon Views on SlideShare
2,990
Embed Views
1,687

Actions

Likes
5
Downloads
62
Comments
1

11 Embeds 1,687

http://thinkingconcurrently.com 831
http://www.jboss.org 440
http://torquebox.org 318
http://planet.jboss.org 59
http://localhost 22
http://staging.torquebox.org 9
https://www.jboss.org 3
http://static.slidesharecdn.com 2
http://planet-stg.jboss.org 1
http://localhost:4242 1
https://si0.twimg.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Must read for Ruby users who can understand it...
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • myths “Ruby doesn’t scale, Rails doesn’t scale”\n
  • scaling out vs scaling up\n
  • \n
  • \n
  • simple Rails controller w/ an accompanying view (not shown) to render the HTML\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • normal load balancers just forward requests to the backend server\nwith mod_cluster, TorqueBox and JBoss AS can send load and other information to the load balancer\n
  • \n
  • When using multicast discovery - there are some other tricks for networks that don’t support multicast\n
  • \n
  • \n
  • Java and Rails applications can share session data\nAS session replication is battle-proven, very configurable\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • If backgroundable is too magic for you, we also support explicit asynchronous tasks\n
  • \n
  • \n
  • \n
  • \n
  • Just like HASingleton services\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Scaling Rails With Torquebox Presented at JUDCon:2011 Boston Scaling Rails With Torquebox Presented at JUDCon:2011 Boston Presentation Transcript

  • Scaling Rails Applications with TorqueBox Ben Browning
  • Ben Browning•TorqueBox Contributor•Red Hat Senior Engineer since July 2010•Ruby yay! JVM yay! Java boo! JRuby yay!
  • The Team
  • TorqueBox•The power of JBoss with the expressiveness of Ruby•Rails, Sinatra, Rack and non-web applications running on top of JBoss AS and JRuby•Messaging, Asynchronous Tasks, Scheduled Jobs, and Services built-in
  • Rails“Ruby on Rails® is an open-source web frameworkthat’s optimized for programmer happiness andsustainable productivity. It lets you write beautiful codeby favoring convention over configuration.” - http://rubyonrails.org
  • ScalingAbility to increase throughput by adding hardware
  • Learn By (Beer) ExampleLet’s create an application to find the most popular beeraccording to Twitter.
  • Beer Tweets•Web front-end•Twitter Streaming API client•Scheduled job to clean old beer tweets•Caching so our database doesn’t fall over
  • Web Front-endclass BeersController < ApplicationController def most_popular @popular_beers = Beer.most_popular(:limit => 25) endend
  • Twitter Streaming API Client•Connect to Twitter’s streaming API and find all tweets containing “beer”•Needs to run as a daemon, outside of the web request / response cycle
  • TorqueBox Services•Long-running, non-web daemons that share the runtime environment and deployment lifecycle of your app•A class with initialize( Hash ), start(), and stop() methods
  • Twitter Streaming API Clientclass BeerService def initialize(options) @client = StreamingTwitter.new(options["username"], options["password"]) end def start Thread.new { find_beer } end def stop @client.disconnect endend
  • Twitter Streaming API Clientclass BeerService def find_beer @client.search(beer) do |tweet| Beer.create_from_json(tweet) end endend
  • Twitter Streaming API Clientconfig/torquebox.yml:services: beer_service: username: ilikebeer password: sodoyou
  • Clean Stale Beer•Delete all beer-related tweets older than 7 days•Run once an hour to prune in manageable chunks
  • Scheduled Jobs•Tasks that need to be executed on a recurring schedule•A class with a run() method
  • Clean Stale Beerclass BeerCleaner def run() Beer.clean_older_than(7.days) endend
  • Clean Stale Beerconfig/torquebox.yml:jobs: beer_cleaner: description: Clean stale beer-related tweets job: BeerCleaner cron: 0 44 * * * ?
  • CachingWe’re showing the same list of most popular beers to allusers so why hit the database on every request?
  • Caching Web Front-endclass BeersController < ApplicationController caches_action :most_popular, :expires_in => 30.seconds def most_popular @popular_beers = Beer.most_popular(:limit => 25) endend
  • Beer TweetsWe’re collecting tweets about beer, serving the resultsup via a cached web interface, and keeping ourdatabase cleaned of stale data.
  • We’re Done, Right?We’ve added all our features and deployed onTorqueBox so we can handle limitless load, right?
  • Benchmarks
  • Benchmarks
  • We’re Done, Right?No way - it’s beer and Twitter! This will be wildlypopular with social alcoholics and we need to planaccordingly - we need to scale!
  • Performance != ScalabilityJust because an application performs well on a singleserver doesn’t mean it can scale.
  • Add More ServersWell, before we can do that we need a load balancer toroute requests to multiple servers.
  • mod_clusterThe same mod_cluster you know and love to use withJBoss AS works with TorqueBox.
  • mod_clusterBased on Apache’s mod_proxy but with two-waycommunication to JBoss and TorqueBox providingintelligent request routing based on load.
  • mod_cluster
  • Add More ServersAs each TorqueBox instance boots it will find the otherTorqueBox and mod_cluster instances and add itself tothe cluster.
  • Sessions•By default Rails stores all session data in cookies•Production Rails applications usually use a database or memcached for session storage•TorqueBox provides its own session storage
  • TorqueBox Sessionsconfig/initializers/session_store.rb:BeerTweets::Application.config. session_store TorqueBox::Session::ServletStore
  • TorqueBox Sessions•Server-side sessions without hitting the database or requiring an external process (memcached)•Uses JBoss AS session replication under the hood
  • Are We Scaled Yet?We’ve taken care of the load balancer and sessionreplication, but what about our Twitter Streaming APIclient? How will it scale?
  • Twitter Streaming API Client•By default our service will start on every node in the cluster•Sometimes that’s what you want, but not in this case; we only want one copy of each beer tweet to be saved.
  • HASingleton Services•TorqueBox supports highly-available singleton services•The service will only run on one node in the cluster•If that node goes down, another node will start the service
  • HASingleton Servicesconfig/torquebox.yml:services: beer_service: username: ilikebeer password: sodoyou singleton: true
  • Twitter Streaming API Client•Now our service will only run on one node, but what happens if tweets come in from Twitter faster than that one node can process them?
  • Backgroundable•Convert any method call into an asynchronous call•Uses HornetQ under the hood and calls are load- balanced across the cluster
  • Backgroundableclass BeerService def find_beer @client.search(beer) do |tweet| Beer.background.create_from_json(tweet) end endend
  • Asynchronous Tasksclass BeerTask < TorqueBox::Messaging::Task def create_from_json(payload) Beer.create_from_json(payload[:tweet]) endend
  • Asynchronous Tasksclass BeerService def find_beer @client.search(beer) do |tweet| BeerTask.async(:create_from_json, :tweet => tweet) end endend
  • Twitter Streaming API ClientAll nodes in our cluster will now process incomingtweets even though only a single node maintains a httpconnection to Twitter.
  • Now We’re Scaled, Right?Not quite - we still have that pesky job that cleans stalebeer to deal with.
  • Clean Stale Beer•By default, scheduled jobs will run on all nodes in a cluster.•We only want our beer cleaning job to run on a single node.
  • HASingleton Jobsconfig/torquebox.yml:jobs: beer_cleaner: description: Clean stale beer-related tweets job: BeerCleaner cron: 0 44 * * * ? singleton: true
  • All Scaled?Almost! We still need to take care of our caching.
  • Caching•Rails ships with support for multiple cache stores (file- based, in-memory, memcached)•None allow multiple nodes to share a common cache without setting up an external process
  • TorqueBoxStore•Rails 3 ActiveSupport::Cache::Store implementation backed by Infinispan•Supports invalidated, replicated, and distributed clustering modes
  • TorqueBoxStoremodule BeerTweets class Application < Rails::Application config.cache_store :torque_box_store(:mode => :distributed, :sync => false) endend
  • Are We Scaled?As we add additional nodes to the cluster they increaseour web request throughput, background jobthroughput, and cache capacity. We’re scaled!
  • But Wait, There’s More!
  • InjectionInject CDI resources, messaging destinations, JNDIentries, MBeans into your Ruby application@questions = inject(‘/queues/questions’)@datasource = inject(‘java:comp/env/jdbc/myDS’)@thing = inject(com.mycorp.Something)@bean = inject(‘SomeMCBean’)
  • Message Processorsclass SeniorHandler < TorqueBox::Messaging::MessageProcessor def on_message(body) puts “Processing #{body} of #{message}” endend
  • Message Processorsconfig/torquebox.yml:messaging: /queues/people: SeniorHandler: filter: “age >= 55” concurrency: 2
  • Queues and Topicsquestions = inject(‘/queues/questions’)answers = inject(‘/queues/answers’)Thread.new do questions.publish ‘What time is it?’ puts answers.receive(:timeout => 1000)endputs questions.receiveanswers.publish Time.now
  • Queues and Topicsconfig/torquebox.yml:queues: /queues/questions: /queues/answers:
  • BackStageDashboard and RESTful API to inspect and control Rubycomponents
  • BackStage
  • StompBoxEasy Heroku-esque git-based deployments
  • StompBox
  • Roadmap1.0.0 Just Released!Upcoming:AS7TransactionsSSODrools / jBPMMobicentsWebSockets
  • Resources•http://torquebox.org•https://github.com/torquebox•#torquebox on FreeNode•@torquebox
  • Thanks!
  • Questions?