MultiBackgroundJob

This library provices an centralized interface to push jobs to a variety of queuing backends. Thus allowing to send jobs to multiple external services. If you are running a Ruby on Rails application consider using Active Jobs. ActiveJobs integrates with a wider range of services and builtin support.

Supported Services:

  • Faktory (Faktory::Client is used as depency to push jobs)
  • Sidekiq (Sidekiq gem is not a depenency. We are using redis connection to push jobs)

Installation

Add this line to your application's Gemfile:

gem 'multi-background-job'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install multi-background-job

Usage

This gem should work with default configurations if you have REDIS_URL and/or FAKTORY_URL environment variables correctly defined. But you can use the MultiBackgroundJob#configure method to customize default settings.

MultiBackgroundJob.configure do |config|
  config.config_path = 'config/background_jobs.yml' # You can use an YAML file. (Default to nil)
  config.redis_pool_size = 10                       # Connection Pool size for redis. (Default to 5)
  config.redis_pool_timeout = 10                    # Connection Pool timeouf for redis. (Default to 5)
  config.redis_namespace = 'app-name'               # The prefix of redis storage keys. (Default to multi-bg)
  config.redis_config = { path: "/tmp/redis.sock" } # List of configurations to be passed along to the Redis.new. (Default to {})
  config.workers = {                                # List of workers and its configurations. (Default to {})
    'Accounts::ConfirmationEmailWorker' => { retry: 5, queue: 'mailing' },
  }
  config.strict = false                             # Only allow to push jobs to known workers. See `config.workers`. (Default to true)
end

Client Setup

You can use the DSL to start building worker and push to background job services.

# Enqueue the 'Accounts::ConfirmationEmailWorker' job with 'User', 1 arguments
# to the sidekiq "other_mailing" queue
MultiBackgroundJob['Accounts::ConfirmationEmailWorker', queue: 'other_mailing' ]
  .with_args('User', 1)
  .push(to: :sidekiq)

# Schedule the 'Accounts::ConfirmationEmailWorker' job with 'User', 1 arguments
# to the sidekiq "other_mailing" queue to be executed in one hour.
MultiBackgroundJob['Accounts::ConfirmationEmailWorker', queue: 'other_mailing' ]
  .with_args('User', 1)
  .in(1.hour)
  .push(to: :sidekiq)

# Enqueue the 'Accounts::ConfirmationEmailWorker' job with 'User', 2 arguments
# to the faktory "mailing" queue(Using :queu from global config.workers definition)
MultiBackgroundJob['Accounts::ConfirmationEmailWorker']
  .with_args('User', 2)
  .push(to: :faktory)

MultiBackgroundJob is not required as a dependency of backend servers if you are only use it to push jobs(** Except when you are using middleware like UniqueJobs Middleware of next section)

Server Setup

This is only a necessary step in the case of using the UniqueJobs Middleware of next section.

Example of sidekiq worker:

class Accounts::ConfirmationEmailWorker
  + extend MultiBackgroundJob.for(:sidekiq, queue: :mailing)
  - include Sidekiq::Worker
  - sidekiq_options queue: :mailing

  def perform(resource_type, resource_id); end;
end

Example of faktory worker:

class Accounts::ConfirmationEmailWorker
  + extend MultiBackgroundJob.for(:sidekiq, queue: :mailing)
  - include Faktory::Job
  - faktory_options queue: :mailing

  def perform(resource_type, resource_id); end;
end

Now when you call Accounts::ConfirmationEmailWorker.perform_async or Accounts::ConfirmationEmailWorker.perform_in it will use this gem to push jobs to the backend server.

Note that settings defined througth the worker class have greater weight then the ones defined from global MultiBackgroundJob.config.workers. And the MultiBackgroundJob.config.workers have greater weight then both Sidekiq.default_worker_options or Faktory.default_job_options.

Unique Jobs

This library provides one experimental technology to avoid enqueue duplicated jobs. Pro versions of sidekiq and faktory provides this functionality. But this project exposes a mechanism to make this control using Redis. It's not required by default. You can load this function by require and initialize the UniqueJob middleware according to the service(:faktory or :sidekiq).

require 'multi_background_job/middleware/unique_job'
MultiBackgroundJob::Middleware::UniqueJob::bootstrap(service: :sidekiq)
# Or
MultiBackgroundJob::Middleware::UniqueJob::bootstrap(service: :faktory)

After that just define the :uniq settings by worker

MultiBackgroundJob['Mailing::SignUpWorker', uniq: { across: :queue, timeout: 120 }]
  .with_args('User', 1)
  .push(to: :sidekiq)

You can globally disable/enable this function with the MultiBackgroundJob.config.unique_job_active = <true|false>

Development

After checking out the repo, run bin/setup to install dependencies. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/marcosgz/multi-background-job.

License

The gem is available as open source under the terms of the MIT License.