SlideShare uma empresa Scribd logo
1 de 111
Lance Ball
                             Asheville.rb
Creative Commons BY-SA 3.0
                              April 2011
whoami

•@lanceball
•> Java?C > C++ > Java > Ruby
 Perl >

•Red Hat Senior Engineer
•member of
Goal

For you to write a Ruby
app on TorqueBox
tonight!
TorqueBox
the power of JBoss with the expressiveness of Ruby
TorqueBox: what?

•A “real” app server for Ruby
•Founded in 2008
•100% open-source, LGPL license
•Based on JBoss AS and JRuby
•Just released 1.0.0.CR2!
Yes, it's Java
I promise...

•No XML
•No Java *
•No war files *
•Only Ruby and YAML
* Unless you really want to
TorqueBox::Why
• Native support for Rack apps +
  standalone Ruby services
• Built-in:
 • background processing
 • scheduling
 • daemons / services
 • clustering
• Easily scalable
• Optionally enterprisey (JAAS, legacy
  Java, etc.)
JRuby
a good idea done well
JRuby: why?

•Very fast runtime
•Real threads
•Java libraries
•Java tools
•Healthy community
JBoss AS
the good parts
The Competition

Unicorn, Thin, Passenger,
Trinidad, Warbler...

...all address only the web
question.
AS = Application Server

•interpreter” server +
 Not just “web

•appshost multiple, disparate
 Can
       simultaneously
•apps it hosts services to all the
 Provides basic
JBoss AS6

•Tomcat for web
•Infinispan for caching
•HornetQ for messaging
•Quartz for scheduling
•PicketBox for authentication
•mod_cluster for clustering
Setting Up TorqueBox
   in a few simple steps!
Easy Install
(download 1.0.0.CR2 from torquebox.org)

$ unzip torquebox-dist-1.0.0.CR2-bin.zip

$ export TORQUEBOX_HOME=$PWD/torquebox-1*
$ export JBOSS_HOME=$TORQUEBOX_HOME/jboss
$ export JRUBY_HOME=$TORQUEBOX_HOME/jruby

$ export PATH=$JRUBY_HOME/bin:$PATH
Easy Install
(download 1.0.0.CR2 from torquebox.org)

$ unzip torquebox-dist-1.0.0.CR1-bin.zip

$ export TORQUEBOX_HOME=$PWD/torquebox-1*
$ export JBOSS_HOME=$TORQUEBOX_HOME/jboss
$ export JRUBY_HOME=$TORQUEBOX_HOME/jruby

$ export PATH=$JRUBY_HOME/bin:$PATH
Easy Install
(download 1.0.0.CR2 from torquebox.org)

$ unzip torquebox-dist-1.0.0.CR2-bin.zip

$ export TORQUEBOX_HOME=$PWD/torquebox-1*
$ export JBOSS_HOME=$TORQUEBOX_HOME/jboss
$ export JRUBY_HOME=$TORQUEBOX_HOME/jruby

$ export PATH=$JRUBY_HOME/bin:$PATH
Easy Install
(download 1.0.0.CR2 from torquebox.org)

$ unzip torquebox-dist-1.0.0.CR2-bin.zip

$ export TORQUEBOX_HOME=$PWD/torquebox-1*
$ export JBOSS_HOME=$TORQUEBOX_HOME/jboss
$ export JRUBY_HOME=$TORQUEBOX_HOME/jruby

$ export PATH=$JRUBY_HOME/bin:$PATH
Easy Install
(download 1.0.0.CR2 from torquebox.org)

$ unzip torquebox-dist-1.0.0.CR1-bin.zip the jruby
                              Make sure
                               found in your path
$ export TORQUEBOX_HOME=$PWD/torquebox-1*
                              is in $JRUBY_HOME/
$ export JBOSS_HOME=$TORQUEBOX_HOME/jboss
$ export JRUBY_HOME=$TORQUEBOX_HOME/jruby

$ export PATH=$JRUBY_HOME/bin:$PATH
Easy Install
(download 1.0.0.CR2 from torquebox.org)

$ unzip torquebox-dist-1.0.0.CR1-bin.zip the jruby
                              Make sure
                               found in your path
$ export TORQUEBOX_HOME=$PWD/torquebox-1*
                              is in $JRUBY_HOME/
$ export JBOSS_HOME=$TORQUEBOX_HOME/jboss
$ export JRUBY_HOME=$TORQUEBOX_HOME/jruby

$ export PATH=$JRUBY_HOME/bin:$PATH
Easy Install

$ jruby -S gem install torquebox --pre

# optional
$ jruby -S gem install bundler
$ jruby -S gem install rails
$ jruby -S gem install sinatra
Rake Tasks
Rakefile




require "torquebox-rake-support"
Database Connectivity
Gemfile



gem "activerecord-jdbc-adapter"

gem "jdbc-postgres"
# gem "jdbc-sqlite3"
# gem "jdbc-mysql"
Rails Template

•Adds TorqueBox rake tasks
•Adds the JDBC sqlite3 gems
•Adds TorqueBox session_store
•Adds Backgroundable module
Rake Tasks

rake torquebox:run
  Run TorqueBox server

rake torquebox:deploy[context_path]
  Deploy the app in the current directory

rake torquebox:undeploy
  Undeploy the app in the current directory
Rake Tasks

Start torquebox:run in its own
shell and leave it running.
Instead of script/server or
shotgun or thin or whatever
else, use torquebox:run.
Deployment Descriptors


 torquebox:deploy creates a
 deployment descriptor in
 the $TORQUEBOX_HOME/
 apps/ directory
Hot Deployment
 $TORQUEBOX_HOME/apps/

• anything added to
  apps/ will get deployed
• anything removed from
  apps/ will get
  undeployed
• anything updated in
  apps/ will get
  redeployed
• TorqueBox deployers
  make JBoss grok YAML
Hot Deployment
 $TORQUEBOX_HOME/apps/
 deployment
•descriptors to
  anything added
  apps/ will get deployed
• anything removed from
  apps/ will get
  undeployed
• anything updated in
  apps/ will get
  redeployed
• TorqueBox deployers
  make JBoss grok YAML
Hot Deployment
 $TORQUEBOX_HOME/apps/
 deployment
•descriptors to
  anything added
  apps/ will get deployed
• anything removed from
  apps/ will get
  undeployed
• anything updated in
  apps/ will get
  redeployed
• TorqueBox deployers
  make JBoss grok YAML
Hot Deployment
  $TORQUEBOX_HOME/apps/

 • anything added to
   apps/ will get deployed
 • anything removed from
   apps/ will get
   undeployed
knob files (zip
 •archives)
   anything updated in
   apps/ will get
   redeployed
 • TorqueBox deployers
   make JBoss grok YAML
Hot Deployment
  $TORQUEBOX_HOME/apps/

 • anything added to
   apps/ will get deployed
 • anything removed from
   apps/ will get
   undeployed
knob files (zip
 •archives)
   anything updated in
   apps/ will get
   redeployed
 • TorqueBox deployers
   make JBoss grok YAML
Deployment Descriptors
apps/myapp-knob.yml

application:
  root:    /path/to/myapp
  env:     development
web:
  context: myapp
  host:    www.yourhost.com
  static: public
environment:
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
Deployment Descriptors
apps/myapp-knob.yml

application:
  root:    /path/to/myapp
  env:     development
web:                      The fully-qualified
  context: myapp
                           path to the app.
  host:    www.yourhost.com
  static: public           This will be the
environment:                value of either
                           RAILS_ROOT or
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
                            RACK_ROOT
Deployment Descriptors
apps/myapp-knob.yml

application:
  root:    /path/to/myapp
  env:     development
web:                      The fully-qualified
  context: myapp
                           path to the app.
  host:    www.yourhost.com
  static: public           This will be the
environment:                value of either
                           RAILS_ROOT or
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
                            RACK_ROOT
Deployment Descriptors
apps/myapp-knob.yml

application:
  root:    /path/to/myapp
  env:     development
web:
  context: myapp          The runtime mode
  host:    www.yourhost.com the app. This
                           of
  static: public             will be either
environment:
                            RAILS_ENV or
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com RACK_ENV
Deployment Descriptors
apps/myapp-knob.yml

application:
  root:    /path/to/myapp
  env:     development
web:
  context: myapp          The runtime mode
  host:    www.yourhost.com the app. This
                           of
  static: public             will be either
environment:
                            RAILS_ENV or
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com RACK_ENV
Deployment Descriptors
                      The app’s context path
 apps/myapp-knob.yml (or “sub URI”):
                   http://localhost:8080/myapp
application:            Can be set via rake:
  root:           rake torquebox:deploy[myapp]
           /path/to/myapp
  env:     development The default is root:
web:                  http://localhost:8080/
  context: myapp
  host:    www.yourhost.com
  static: public
environment:
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
Deployment Descriptors
                      The app’s context path
 apps/myapp-knob.yml (or “sub URI”):
                   http://localhost:8080/myapp
application:            Can be set via rake:
  root:           rake torquebox:deploy[myapp]
           /path/to/myapp
  env:     development The default is root:
web:                  http://localhost:8080/
  context: myapp
  host:    www.yourhost.com
  static: public
environment:
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
Deployment Descriptors
apps/myapp-knob.yml

application:
                            A list of virtual
  root:    /path/to/myapp
  env:     development      hostnames to
web:                      which to bind the
  context: myapp
  host:    www.yourhost.com
  static: public
environment:
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
Deployment Descriptors
apps/myapp-knob.yml

application:
                            A list of virtual
  root:    /path/to/myapp
  env:     development      hostnames to
web:                      which to bind the
  context: myapp
  host:    www.yourhost.com
  static: public
environment:
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
Deployment Descriptors
apps/myapp-knob.yml

application:
  root:    /path/to/myapp
  env:     development       The location of
web:                        the app’s static
  context: myapp             content, either
  host:    www.yourhost.com
  static: public
                               absolute or
environment:                 relative to the
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
Deployment Descriptors
apps/myapp-knob.yml

application:
  root:    /path/to/myapp
  env:     development       The location of
web:                        the app’s static
  context: myapp             content, either
  host:    www.yourhost.com
  static: public
                               absolute or
environment:                 relative to the
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
Deployment Descriptors
apps/myapp-knob.yml

application:
  root:    /path/to/myapp       Any
  env:     development
web:                        environment
  context: myapp              variables
  host:    www.yourhost.com
  static: public
environment:
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
Deployment Descriptors
apps/myapp-knob.yml

application:
  root:    /path/to/myapp       Any
  env:     development
web:                        environment
  context: myapp              variables
  host:    www.yourhost.com
  static: public
environment:
  MAIL_HOST: mail.yourhost.com
  REPLY_TO: you@yourhost.com
Deployment Descriptors

•config/torquebox.yml
•internal descriptors have
 the same structure as the
 external ones in apps/
•may be used to provide
 your own reasonable
 defaults
Components
Put 'em together, and you have an AS
Web
make rack, not war
jruby-rack
 •supported: rails, sinatra, etc
  All rack-based frameworks

 •deploy from where they apps
  No packaging required:
                            sit on
   disk
 • No redeploy necessary to see
   changes when using rack
   reloading, shotgun or rails
   development mode
 • We use it inside Tomcat
Scheduling
get regular later
Jobs
app/jobs/newsletter_sender.rb

class NewsletterSender
 
  def run()
    subscriptions = Subscription.find(:all)
    subscriptions.each do |e|
      send_newsletter( e )
    end
  end
 
end
Jobs
config/torquebox.yml

jobs:
  monthly_newsletter:
   description: first of month
   job: NewsletterSender
   cron: ‘0 0 0 1 * ?’

 process_tps_reports:
  job: TPSReportProcessor
  cron: ‘0 0 0 0 MON ?’
Jobs
 “Fire every half hour from 10am until
    1pm on the third Friday of each
                 month”
  0      */30 10-13        ?      *      FRI#3

Seconds Minutes   Hours   DOM    Month   DOW     Year

                                          1-7
                                 1-12            1970-
                          1-31           SUN-
 0-59    0-59     0-23           JAN-            2099
                          ?LW            SAT
                                 DEC             empty
                                         ?L#
Jobs
•day ofportable. What is the first
 More
        the week on BSD again?
  What’s cron on Windows?
• Self contained within the app.
  No external systems to manage
  and keep in sync.
• Full application environment
  loaded and available.
Messaging
 asynchronicity
TorqueBox::Messaging


• JMS (Java Message Service)
 is an API for messaging
• HornetQ is the JBoss JMS
 implementation
Background Processing



•Tasks
•Backgroundable
Tasks
app/tasks/email_task.rb

class EmailTask < TorqueBox::Messaging::Task
  def welcome(payload)
    person = Person.find_by_id(payload[:id])
    person.send_welcome_spam if person
  end
end
Tasks
app/tasks/email_task.rb

class EmailTask < TorqueBox::Messaging::Task
  def welcome(payload)
    person = Person.find_by_id(payload[:id])
    person.send_welcome_spam if person
  end
end
Tasks
app/tasks/email_task.rb

class EmailTask < TorqueBox::Messaging::Task
  def welcome(payload)
    person = Person.find_by_id(payload[:id])
    person.send_welcome_spam if person
  end
end
Tasks
app/tasks/email_task.rb

class EmailTask < TorqueBox::Messaging::Task
  def welcome(payload)
    person = Person.find_by_id(payload[:id])
    person.send_welcome_spam if person
  end
end
Tasks
app/controllers/people_controller.rb


class PeopleController < ApplicationController
  def create
    @person = Person.new(params[:person])
    respond_to do |format|
      if @person.save
        EmailTask.async(:welcome, :id => person.id)
        # respond appropriately
      end
    end
  end
end
Tasks
app/controllers/people_controller.rb


class PeopleController < ApplicationController
  def create
    @person = Person.new(params[:person])
    respond_to do |format|
      if @person.save
        EmailTask.async(:welcome, :id => person.id)
        # respond appropriately
      end
    end
  end
end
Backgroundable

Inspired by DelayedJob’s
handle_asynchronously,
it’s trivial to create
implicit background
Tasks.
Backgroundable
 lib/something.rb

include TorqueBox::Messaging

class WelcomeEmailer
 include Backgroundable
 always_background :welcome

  def welcome(id)
    person = Person.find_by_id(id)
    person.send_welcome_spam if person
  end
  def depart(id)
    # do something else
  end
end
...
@emailer.welcome(an_id)
@something.background.depart(an_id)
Backgroundable
 lib/something.rb

include TorqueBox::Messaging

class WelcomeEmailer
 include Backgroundable
 always_background :welcome

  def welcome(id)
    person = Person.find_by_id(id)
    person.send_welcome_spam if person
  end
  def depart(id)
    # do something else
  end
end
...
@emailer.welcome(an_id)
@something.background.depart(an_id)
Backgroundable
 lib/something.rb
include TorqueBox::Messaging

class WelcomeEmailer
 include Backgroundable
 always_background :welcome

  def welcome(id)
    person = Person.find_by_id(id)
    person.send_welcome_spam if person
  end
  def depart(id)
    # do something else
  end
end
...
@emailer.welcome(an_id)
@something.background.depart(an_id)
Backgroundable
 lib/something.rb
include TorqueBox::Messaging

class WelcomeEmailer
 include Backgroundable
 always_background :welcome

  def welcome(id)
    person = Person.find_by_id(id)
    person.send_welcome_spam if person
  end
  def depart(id)
    # do something else
  end
end
...
@emailer.welcome(an_id)
@something.background.depart(an_id)
Background Processing

 Call it from your
 controllers, models,
 and observers, or even
 other tasks. Even in
 non-Rails apps!
Background Processing
•No extra tables in your database
•No external system to manage
•Little to no config required at all
•System gets redeployed w/app
•Efficient loading of rails
 environment
•Automatic load balancing and
 retries
•Works on Windows, if you care
Queues
Tasks and Backgroundable are
built on top of Queues. Of
course, you may build your
own messaging based apps by
defining your own Queues,
Topics, and their message
Processors yourself.
Queues
config/torquebox.yml

queues:
 /queues/questions:

/queues/answers:
 durable: false
Topics
•interface is different, but
 behavior
           is the same.
•each message, of a only one
 all subscribers
                  but
                      topic see
  subscriber will see any message
  from a queue
• use topics: section of
  torquebox.yml to define topics
Processors

You can create a
processor class to
receive messages from a
Topic or Queue
Processors
app/models/print_handler.rb

include TorqueBox::Messaging

class PrintHandler < MessageProcessor
  def initialize(opts)
    @printer = opts['printer'] || default
  end
  def on_message(body)
    puts "Processing #{body} of #{message}"
  end
end
Processors
config/torquebox.yml

messaging:
  /topics/orders:
    - PrintHandler
    - ShoutHandler
  /queues/receipts:
    PrintHandler:
      concurrency: 5
      config:
        printer: the_little_one
Processors
config/torquebox.yml

messaging:
  /topics/orders:
    - PrintHandler
    - ShoutHandler
  /queues/receipts:
    PrintHandler:
      concurrency: 5
      config:
        printer: the_little_one
Processors
config/torquebox.yml

messaging:
  /topics/orders:
    - PrintHandler
    - ShoutHandler
  /queues/receipts:
    PrintHandler:
      concurrency: 5
      config:
        printer: the_little_one
Processors
config/torquebox.yml

messaging:
  /topics/orders:
    - PrintHandler
    - ShoutHandler
  /queues/receipts:
    PrintHandler:
      concurrency: 5
      config:
        printer: the_little_one
Processors
app/models/print_handler.rb

include TorqueBox::Messaging

class PrintHandler < MessageProcessor
  def initialize(opts)
    @printer = opts['printer'] || default
  end
  def on_message(body)
    puts "Processing #{body} of #{message}"
  end
end
Queues (again)


But how do you send a
message?
Queues
contrived example

questions = Queue.new('/queues/questions')
answers = Queue.new('/queues/answers')
 
Thread.new do
  questions.publish "What time is it?"
  puts answers.receive( :timeout => 1000 )
end
 
puts questions.receive
answers.publish Time.now
Queues
contrived example

questions = Queue.new('/queues/questions')
answers = Queue.new('/queues/answers')
 
Thread.new do
  questions.publish "What time is it?"
  puts answers.receive( :timeout => 1000 )
end
 
puts questions.receive
answers.publish Time.now
Queues
contrived example

questions = Queue.new('/queues/questions')
answers = Queue.new('/queues/answers')
 
Thread.new do
  questions.publish "What time is it?"
  puts answers.receive( :timeout => 1000 )
end
 
puts questions.receive
answers.publish Time.now
Queues
contrived example

questions = Queue.new('/queues/questions')
answers = Queue.new('/queues/answers')
 
Thread.new do
  questions.publish "What time is it?"
  puts answers.receive( :timeout => 1000 )
end
 
puts questions.receive
answers.publish Time.now
Services
run along, lil’ daemon
Services

Long-running, non-web
“daemons” that share
the runtime environment
and deployment lifecycle
of your app.
Services
•optional initialize(Hash), start()
 Represented as a class with
  and stop() methods, which
  should each return quickly.
• Typically will start a long-
  running loop in a thread and
  respond to external events.
• Configured via services: section
  in torquebox.yml
Services
config/torquebox.yml


services:
 TimeMachine:
  queue: /queue/morris_day

 MyMudServer:

 SomeOtherService:
Services
 app/services/time_machine.rb

class TimeMachine
 def initialize(opts)
   @queue = Queue.new(opts['queue'])
 end

 def start
  Thread.new do
    until @done
      @queue.publish(Time.now)
      sleep(1)
    end
   end
 end

 def stop; @done = true; end
end
Services
 app/services/time_machine.rb

class TimeMachine
 def initialize(opts)
   @queue = Queue.new(opts['queue'])
  end

 def start
  Thread.new do
    until @done
      @queue.publish(Time.now)
      sleep(1)
    end
   end
 end

 def stop; @done = true; end
end
Services
 app/services/time_machine.rb

class TimeMachine
 def initialize(opts)
   @queue = Queue.new(opts['queue'])
 end

 def start
  Thread.new do
    until @done
      @queue.publish(Time.now)
      sleep(1)
    end
   end
 end

 def stop; @done = true; end
end
Services
 app/services/time_machine.rb

class TimeMachine
 def initialize(opts)
   @queue = Queue.new(opts['queue'])
 end

 def start
  Thread.new do
    until @done
      @queue.publish(Time.now)
      sleep(1)
    end
   end
 end

 def stop; @done = true; end
end
Caching
save a little for later
Caching
config/application.rb


config.cache_store =
:torque_box_store, :mode => :local

# or

config.cache_store =
ActiveSupport::Cache::TorqueBoxStore.new( :mode
=> :local )
Runtime Options
   shorts or sweats?
Runtime Options
config/torquebox.yml


#per app!
ruby:
 version: 1.9
 compile_mode: jit
Clustering
less failure faster
Web

•session replication
•mod_cluster)
 intelligent load-balancing (via

•failover (via mod_cluster)
Messaging

HornetQ clusters
automatically, giving you
message processing
capability that grows
with the cluster.
Services

A service runs on every
cluster node, unless
marked as a singleton.
Jobs

A job runs on every
cluster node, unless
marked as a singleton
(just like services).
Caching

Infinispan clusters
automatically,
"distributing" your
cache.
BENchmarks
Real-world Rails application:
Redmine
Comparisons:
TorqueBox, Trinidad, Passenger,
Unicorn, Glassfish, Thin
Runtimes:
JRuby, MRI, RubyEE
Roadmap
May - 1.0.0.Final
Then...
 AS7
 Authentication
 Mobicents
 ??? - you tell us
Resources

•http://torquebox.org
•irc: #torquebox on freenode
•https://github.com/torquebox
•http://twitter.com/torquebox
Thanks!
questions?

Mais conteúdo relacionado

Mais procurados

Apache Sling - The whys and the hows
Apache Sling - The whys and the howsApache Sling - The whys and the hows
Apache Sling - The whys and the howsRobert Munteanu
 
What’s New in Rails 5.0?
What’s New in Rails 5.0?What’s New in Rails 5.0?
What’s New in Rails 5.0?Unboxed
 
Laravel Beginners Tutorial 1
Laravel Beginners Tutorial 1Laravel Beginners Tutorial 1
Laravel Beginners Tutorial 1Vikas Chauhan
 
BOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyoBOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyoToshiaki Maki
 
Getting to know Laravel 5
Getting to know Laravel 5Getting to know Laravel 5
Getting to know Laravel 5Bukhori Aqid
 
Laravel 5 Annotations: RESTful API routing
Laravel 5 Annotations: RESTful API routingLaravel 5 Annotations: RESTful API routing
Laravel 5 Annotations: RESTful API routingChristopher Pecoraro
 
API Development with Laravel
API Development with LaravelAPI Development with Laravel
API Development with LaravelMichael Peacock
 
Hosting Your Own OTA Update Service
Hosting Your Own OTA Update ServiceHosting Your Own OTA Update Service
Hosting Your Own OTA Update ServiceQuinlan Jung
 
Laravel for Web Artisans
Laravel for Web ArtisansLaravel for Web Artisans
Laravel for Web ArtisansRaf Kewl
 
REST in-practice, in practice!
REST in-practice, in practice!REST in-practice, in practice!
REST in-practice, in practice!Codemotion
 
Adventures in Laravel 5 SunshinePHP 2016 Tutorial
Adventures in Laravel 5 SunshinePHP 2016 TutorialAdventures in Laravel 5 SunshinePHP 2016 Tutorial
Adventures in Laravel 5 SunshinePHP 2016 TutorialJoe Ferguson
 
Your first sinatra app
Your first sinatra appYour first sinatra app
Your first sinatra appRubyc Slides
 
Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)Viral Solani
 
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...Matt Gauger
 
Tracking huge files with Git LFS (GlueCon 2016)
Tracking huge files with Git LFS (GlueCon 2016)Tracking huge files with Git LFS (GlueCon 2016)
Tracking huge files with Git LFS (GlueCon 2016)Tim Pettersen
 
Building drupal web farms with IIS - part 1
Building drupal web farms with IIS - part 1Building drupal web farms with IIS - part 1
Building drupal web farms with IIS - part 1Alessandro Pilotti
 

Mais procurados (20)

Apache Sling - The whys and the hows
Apache Sling - The whys and the howsApache Sling - The whys and the hows
Apache Sling - The whys and the hows
 
What’s New in Rails 5.0?
What’s New in Rails 5.0?What’s New in Rails 5.0?
What’s New in Rails 5.0?
 
Laravel Beginners Tutorial 1
Laravel Beginners Tutorial 1Laravel Beginners Tutorial 1
Laravel Beginners Tutorial 1
 
BOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyoBOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyo
 
Getting to know Laravel 5
Getting to know Laravel 5Getting to know Laravel 5
Getting to know Laravel 5
 
Laravel 5 Annotations: RESTful API routing
Laravel 5 Annotations: RESTful API routingLaravel 5 Annotations: RESTful API routing
Laravel 5 Annotations: RESTful API routing
 
API Development with Laravel
API Development with LaravelAPI Development with Laravel
API Development with Laravel
 
Hosting Your Own OTA Update Service
Hosting Your Own OTA Update ServiceHosting Your Own OTA Update Service
Hosting Your Own OTA Update Service
 
Laravel for Web Artisans
Laravel for Web ArtisansLaravel for Web Artisans
Laravel for Web Artisans
 
REST in-practice, in practice!
REST in-practice, in practice!REST in-practice, in practice!
REST in-practice, in practice!
 
Adventures in Laravel 5 SunshinePHP 2016 Tutorial
Adventures in Laravel 5 SunshinePHP 2016 TutorialAdventures in Laravel 5 SunshinePHP 2016 Tutorial
Adventures in Laravel 5 SunshinePHP 2016 Tutorial
 
Why Laravel?
Why Laravel?Why Laravel?
Why Laravel?
 
Presentation laravel 5 4
Presentation laravel 5 4Presentation laravel 5 4
Presentation laravel 5 4
 
Your first sinatra app
Your first sinatra appYour first sinatra app
Your first sinatra app
 
Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)
 
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
 
Tracking huge files with Git LFS (GlueCon 2016)
Tracking huge files with Git LFS (GlueCon 2016)Tracking huge files with Git LFS (GlueCon 2016)
Tracking huge files with Git LFS (GlueCon 2016)
 
Building drupal web farms with IIS - part 1
Building drupal web farms with IIS - part 1Building drupal web farms with IIS - part 1
Building drupal web farms with IIS - part 1
 
Devignition 2011
Devignition 2011Devignition 2011
Devignition 2011
 
Dependency Management With Pinto
Dependency Management With PintoDependency Management With Pinto
Dependency Management With Pinto
 

Destaque

TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011Lance Ball
 
Torquebox rubyhoedown-2012
Torquebox rubyhoedown-2012Torquebox rubyhoedown-2012
Torquebox rubyhoedown-2012Lance Ball
 
DataMapper on Infinispan
DataMapper on InfinispanDataMapper on Infinispan
DataMapper on InfinispanLance Ball
 
Complex Made Simple: Sleep Better With TorqueBox
Complex Made Simple: Sleep Better With TorqueBoxComplex Made Simple: Sleep Better With TorqueBox
Complex Made Simple: Sleep Better With TorqueBoxLance Ball
 
The Outcome Economy
The Outcome EconomyThe Outcome Economy
The Outcome EconomyHelge Tennø
 
The Six Highest Performing B2B Blog Post Formats
The Six Highest Performing B2B Blog Post FormatsThe Six Highest Performing B2B Blog Post Formats
The Six Highest Performing B2B Blog Post FormatsBarry Feldman
 

Destaque (6)

TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011
 
Torquebox rubyhoedown-2012
Torquebox rubyhoedown-2012Torquebox rubyhoedown-2012
Torquebox rubyhoedown-2012
 
DataMapper on Infinispan
DataMapper on InfinispanDataMapper on Infinispan
DataMapper on Infinispan
 
Complex Made Simple: Sleep Better With TorqueBox
Complex Made Simple: Sleep Better With TorqueBoxComplex Made Simple: Sleep Better With TorqueBox
Complex Made Simple: Sleep Better With TorqueBox
 
The Outcome Economy
The Outcome EconomyThe Outcome Economy
The Outcome Economy
 
The Six Highest Performing B2B Blog Post Formats
The Six Highest Performing B2B Blog Post FormatsThe Six Highest Performing B2B Blog Post Formats
The Six Highest Performing B2B Blog Post Formats
 

Semelhante a Torquebox Asheville.rb April 2011

Automated Java Deployments With Rpm
Automated Java Deployments With RpmAutomated Java Deployments With Rpm
Automated Java Deployments With RpmMartin Jackson
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Rafael Dohms
 
Socket applications
Socket applicationsSocket applications
Socket applicationsJoão Moura
 
Fargate 를 이용한 ECS with VPC 1부
Fargate 를 이용한 ECS with VPC 1부Fargate 를 이용한 ECS with VPC 1부
Fargate 를 이용한 ECS with VPC 1부Hyun-Mook Choi
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf Conference
 
Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.catPablo Godel
 
DCSF19 Dockerfile Best Practices
DCSF19 Dockerfile Best PracticesDCSF19 Dockerfile Best Practices
DCSF19 Dockerfile Best PracticesDocker, Inc.
 
Rails Engine | Modular application
Rails Engine | Modular applicationRails Engine | Modular application
Rails Engine | Modular applicationmirrec
 
DockerCon EU 2018 - Dockerfile Best Practices
DockerCon EU 2018 - Dockerfile Best PracticesDockerCon EU 2018 - Dockerfile Best Practices
DockerCon EU 2018 - Dockerfile Best PracticesTibor Vass
 
DCEU 18: Dockerfile Best Practices
DCEU 18: Dockerfile Best PracticesDCEU 18: Dockerfile Best Practices
DCEU 18: Dockerfile Best PracticesDocker, Inc.
 
Cocoapods and Most common used library in Swift
Cocoapods and Most common used library in SwiftCocoapods and Most common used library in Swift
Cocoapods and Most common used library in SwiftWan Muzaffar Wan Hashim
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKJosé Paumard
 
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...Amazon Web Services
 
Running Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic BeanstalkRunning Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic BeanstalkAmazon Web Services
 
Composer for busy developers - DPC13
Composer for busy developers - DPC13Composer for busy developers - DPC13
Composer for busy developers - DPC13Rafael Dohms
 

Semelhante a Torquebox Asheville.rb April 2011 (20)

Automated Java Deployments With Rpm
Automated Java Deployments With RpmAutomated Java Deployments With Rpm
Automated Java Deployments With Rpm
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Socket applications
Socket applicationsSocket applications
Socket applications
 
Fargate 를 이용한 ECS with VPC 1부
Fargate 를 이용한 ECS with VPC 1부Fargate 를 이용한 ECS with VPC 1부
Fargate 를 이용한 ECS with VPC 1부
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
 
Intro to Rack
Intro to RackIntro to Rack
Intro to Rack
 
Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.cat
 
DCSF19 Dockerfile Best Practices
DCSF19 Dockerfile Best PracticesDCSF19 Dockerfile Best Practices
DCSF19 Dockerfile Best Practices
 
Composer
ComposerComposer
Composer
 
Rails Engine | Modular application
Rails Engine | Modular applicationRails Engine | Modular application
Rails Engine | Modular application
 
Capistrano Overview
Capistrano OverviewCapistrano Overview
Capistrano Overview
 
DockerCon EU 2018 - Dockerfile Best Practices
DockerCon EU 2018 - Dockerfile Best PracticesDockerCon EU 2018 - Dockerfile Best Practices
DockerCon EU 2018 - Dockerfile Best Practices
 
DCEU 18: Dockerfile Best Practices
DCEU 18: Dockerfile Best PracticesDCEU 18: Dockerfile Best Practices
DCEU 18: Dockerfile Best Practices
 
Cocoapods and Most common used library in Swift
Cocoapods and Most common used library in SwiftCocoapods and Most common used library in Swift
Cocoapods and Most common used library in Swift
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UK
 
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
 
TorqueBox
TorqueBoxTorqueBox
TorqueBox
 
Running Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic BeanstalkRunning Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic Beanstalk
 
Composer for busy developers - DPC13
Composer for busy developers - DPC13Composer for busy developers - DPC13
Composer for busy developers - DPC13
 

Último

Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 

Último (20)

Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 

Torquebox Asheville.rb April 2011

Notas do Editor

  1. who uses ruby? + story\n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. SLOW THE FUCK DOWN - BUILT ON THE SHOULDERS OF GIANTS\nfocus on the non-web\nthe rest of this talk is the &apos;why&apos;\n\n
  11. two great technologies\nshoulders of giants\n
  12. 1.6.1\n
  13. Why wouldn&amp;#x2019;t you use it?\nlead with rake/rspec\nFFI support there now, C ext. support soon. Both are slower than on MRI\n
  14. \n
  15. \n
  16. \n
  17. Our goal: bring as much JBoss goodness as we can to Ruby\n- TB is new, but based on stable technologies\n
  18. SLOW THE FUCK DOWN\n
  19. Ensure you have Java 6 installed\n
  20. Ensure you have Java 6 installed\n
  21. Ensure you have Java 6 installed\n
  22. Ensure you have Java 6 installed\n
  23. Ensure you have Java 6 installed\n- rvm\n
  24. jruby&apos;s gem_home\n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. SLOW THE FUCK DOWN\n
  43. \n
  44. - your app appears to be a java app to Tomcat\n- Sinatra reloading is a bit wonky. Shotgun does work, but a safer bet is to touch your deployment descriptor\n
  45. HIDE THIS SLIDE??\n
  46. \n
  47. Can reside anywhere in the load path, app/jobs is preferred\nOnly a run() method is required\nCommon example: send monthly newsletter\n
  48. \n
  49. more granular than standard cron - L=last day of week/month, W=weekday\nThe last day of the month\nThe last weekday of the month\nThe weekday closest to the 15th\n
  50. instead of each cron job spawning your app\n
  51. SLOW THE FUCK DOWN\nThis is what people use Delayed::Job for\n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. /app/tasks or /tasks\nsimilar to Delayed::Job functionality\n
  83. \n
  84. payload is a hash\n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. Or integrate with a legacy Java app through its queues.\n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. These can be anywhere in the load path, but lib and/or app/models is typical\n
  104. concurrency - how many processors are allowed to work at once - default is 1\nconfig - passed to class initializer\n
  105. \n
  106. \n
  107. \n
  108. \n
  109. Ruby messages are Marshaled and Base64-encoded\n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. anywhere in the load path, but app/services is preferred\nDON&amp;#x2019;T EXPLAIN - line by line coming up\n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. - built on Infinispan Data Grid\n-clustered requires no hosts config (like memcached)\n-ActiveSupport 3 only\n
  122. \n
  123. \n
  124. How we do it, advantages\ngood blog post on tb.org\n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. applies to all runtimes for the app (messaging, jobs, services)\n
  131. SLOW THE FUCK DOWN\narticles posted on torquebox.org detailing clustering config\n\n
  132. reverse proxy / load balancer\nAs server nodes join and leave the cluster, the balancer (mod_cluster) is aware of these changes.\n
  133. As server nodes join and leave the cluster, the balancer (mod_cluster) is aware of these changes.\n
  134. \n
  135. \n
  136. \n
  137. local, invalidation, replicated, distributed\n
  138. \n
  139. \n
  140. \n
  141. 80 minute test, # clients increasing every 10m\n
  142. \n
  143. community driven\n
  144. \n
  145. \n
  146. \n
  147. \n
  148. design happens in #torquebox \n
  149. - would you use it?\n- RHT is hiring rubyists in rdu - see me after\n- stickers\n- repeat questions\n
  150. \n
  151. \n
  152. \n
  153. *.bat equivalents\nwindows service config\n
  154. \n
  155. \n