basecamp/resque-pool

Name: resque-pool

Owner: Basecamp

Description: quickly fork a pool resque workers, saving memory (w/REE) and monitoring their uptime.

Created: 2010-11-12 17:18:37.0

Updated: 2014-10-25 15:04:14.0

Pushed: 2011-04-11 20:27:05.0

Homepage: http://rubygems.org/gems/resque-pool

Size: 275

Language: Ruby

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

Resque Pool

Resque pool is a simple library for managing a pool of resque workers. Given a a config file, it manages your workers for you, starting up the appropriate number of workers for each worker type.

Benefits
Upgrading?

See Changelog.md in case there are important or helpful changes.

How to use
YAML file config

Create a config/resque-pool.yml (or resque-pool.yml) with your worker counts. The YAML file supports both using root level defaults as well as environment specific overrides (RACK_ENV, RAILS_ENV, and RESQUE_ENV environment variables can be used to determine environment). For example in config/resque-pool.yml:

foo: 1
bar: 2
"foo,bar,baz": 1

production:
  "foo,bar,baz": 4
Rake task config

Require the rake tasks (resque/pool/tasks) in your Rakefile, load your application environment, configure Resque as necessary, and configure resque:pool:setup to disconnect all open files and sockets in the pool manager and reconnect in the workers. For example, with rails you should put the following into lib/tasks/resque.rake:

require 'resque/pool/tasks'
# this task will get called before resque:pool:setup
# and preload the rails environment in the pool manager
task "resque:setup" => :environment do
  # generic worker setup, e.g. Hoptoad for failed jobs
end
task "resque:pool:setup" do
  # close any sockets or files in pool manager
  ActiveRecord::Base.connection.disconnect!
  # and re-open them in the resque worker parent
  Resque::Pool.after_prefork do |job|
    ActiveRecord::Base.establish_connection
  end
end
Start the pool manager

Then you can start the queues via:

resque-pool --daemon --environment production

This will start up seven worker processes, one exclusively for the foo queue, two exclusively for the bar queue, and four workers looking at all queues in priority. With the config above, this is similar to if you ran the following:

rake resque:work RAILS_ENV=production QUEUES=foo &
rake resque:work RAILS_ENV=production QUEUES=bar &
rake resque:work RAILS_ENV=production QUEUES=bar &
rake resque:work RAILS_ENV=production QUEUES=foo,bar,baz &
rake resque:work RAILS_ENV=production QUEUES=foo,bar,baz &
rake resque:work RAILS_ENV=production QUEUES=foo,bar,baz &
rake resque:work RAILS_ENV=production QUEUES=foo,bar,baz &

The pool manager will stay around monitoring the resque worker parents, giving three levels: a single pool manager, many worker parents, and one worker child per worker (when the actual job is being processed). For example, ps -ef f | grep [r]esque (in Linux) might return something like the following:

resque    13858     1  0 13:44 ?        S      0:02 resque-pool-manager: managing [13867, 13875, 13871, 13872, 13868, 13870, 13876]
resque    13867 13858  0 13:44 ?        S      0:00  \_ resque-1.9.9: Waiting for foo
resque    13868 13858  0 13:44 ?        S      0:00  \_ resque-1.9.9: Waiting for bar
resque    13870 13858  0 13:44 ?        S      0:00  \_ resque-1.9.9: Waiting for bar
resque    13871 13858  0 13:44 ?        S      0:00  \_ resque-1.9.9: Waiting for foo,bar,baz
resque    13872 13858  0 13:44 ?        S      0:00  \_ resque-1.9.9: Forked 7481 at 1280343254
resque     7481 13872  0 14:54 ?        S      0:00      \_ resque-1.9.9: Processing foo since 1280343254
resque    13875 13858  0 13:44 ?        S      0:00  \_ resque-1.9.9: Waiting for foo,bar,baz
resque    13876 13858  0 13:44 ?        S      0:00  \_ resque-1.9.9: Forked 7485 at 1280343255
resque     7485 13876  0 14:54 ?        S      0:00      \_ resque-1.9.9: Processing bar since 1280343254

Running as a daemon will default to placing the pidfile and logfiles in the conventional rails locations, although you can configure that. See resque-pool --help for more options.

SIGNALS

The pool manager responds to the following signals:

Use HUP to help logrotate run smoothly and to change the number of workers per worker type.

Other Features

An example chef cookbook is provided (and should Just Work at Engine Yard as is; just provide a /data/#{app_name}/shared/config/resque-pool.yml on your utility instances). Even if you don't use chef you can use the example init.d and monitrc erb templates in examples/chef_cookbook/templates/default.

You can also start a pool manager via rake resque:pool or from a plain old ruby script by calling Resque::Pool.run.

Workers will watch the pool manager, and gracefully shutdown (after completing their current job) if the manager process disappears before them.

You can specify an alternate config file by setting the RESQUE_POOL_CONFIG or with the --config command line option.

TODO

See the TODO list at github issues.

Contributors

This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.