Resque Remote is a plugin to allow remote job droppability. Try saying that 10 times fast.

Resque is great and so is queue-based job processing with redis. Resque Remote aims to provide you the ability to queue a job without having the processing class (e.g. the Job handler itself) loaded into memory.

Resque Remote's simple goal is to allow you to add a job to a queue with a string identifier for the class rather than the class constant. It is assumed that the worker-side of the equation will have the class in memory and hence will be able to run it no problem. If this isn't the case, the worker will explode in a fiery ball. Probably getting some on you as a result.

Installation

NOTE: Resque-remote is compatible with Resque 1.x but unnececssary for >= 2.x. If you are using Resque 2.x, use the standard API method Resque.push instead.

Install the gem ad-hoc:

$ gem install resque -v 0.10.0
$ gem install resque-remote

Or, add it to your Bundler Gemfile:

# Gemfile
gem 'resque', '< 2.0'
gem 'resque-remote'

And then run a bundle install.

Without Bundler, in your appropriate config location for your app:

require 'resque'
require 'resque-remote'

If you're using bundler, just setup your gemset normally.

Usage

(De)Queueing

To queue a job, tell resque to remote_enqueue your job by passing the string representation of your job's class name, the name of the queue to use, and whatever parameters are appropriate for the job.

Resque.remote_enqueue('UpdateStockTicker', :ticker_low, param1, param2, ...)

To dequeue, call remote_dequeue instead:

Resque.remote_dequeue('UpdateStockTicker', :ticker_low, param1, param2, ...)

Worker processing

Resque Remotes purpose is to make remote job processing doable. Hence, your workers won't be running the same application code that actually queued the job for you in the first place. So, assuming I queued the jobs from above, your separate application should have an implementing class that your workers have access to.

Note that the queue this job belongs to isn't defined in our job class because it's metadata that Resque uses when it first queues the job, which we've already done. So, no @queue = :low_priority needed here.

class UpdateStockTicker
    # no queue needed

    def self.perform(param1, param2)
        # ... process the job herre
    end
end

Errata

Feedback, comments and questions are welcome at bj [dot] neilsen [at] gmail [dot] com.