by nickelser

Rate limiting/job enabling for ActiveJob using distributed locks in Redis or Memcached.

206 Stars 16 Forks Last release: over 3 years ago (v0.1.3) 30 Commits 4 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

ActiveJob::TrafficControl Build Status Code Climate Test Coverage Gem Version

Rate controls for your

s, powered by Suo, a distributed semaphore library backed by Redis or Memcached.


Add this line to your application's Gemfile:

gem 'activejob-traffic_control'

And then execute:

$ bundle

Or install it yourself as:

$ gem install activejob-traffic_control


adds three modules you can mixin to your job classes as needed, or to
if you are using ActiveJob 5+ (or you have created a base job class yourself).
# to initialize the type of locking client (memcached vs. redis):
ActiveJob::TrafficControl.client = 5, timeout: 5) { } # set poolthresholds as needed
# or, ActiveJob::TrafficControl.client = 5, timeout: 5) { }
# or if not multithreaded, ActiveJob::TrafficControl.client =


class CanThrottleJob < ActiveJob::Base
  throttle threshold: 2, period: 1.second

def perform # no more than two of CanThrottleJob will run every second # if more than that attempt to run, they will be re-enqueued to run in a random time # ranging from 1 - 5x the period (so, 1-5 seconds in this case) end end

If you do not care about the job being re-enqueued (if it's scheduled to run otherwise, or dropping will have no ill effect), you can specify

drop: true
instead. The
drop: true
flag also applies to
, below.
class CanThrottleAndDropJob < ActiveJob::Base
  throttle threshold: 2, period: 1.second, drop: true

def perform # no more than two of CanThrottleJob will run every second # if more than that attempt to run, they will be dropped end end


class ConcurrencyTestJob < ActiveJob::Base
  concurrency 5, drop: false

def perform # only five ConcurrencyTestJob will ever run simultaneously end end



, you also need to configure the cache client:
ActiveJob::TrafficControl.cache_client = Rails.cache.dalli # if using :dalli_store
# or ActiveJob::TrafficControl.cache_client = ActiveSupport::Cache.lookup_store(:dalli_store, "localhost:11211")
class CanDisableJob < ActiveJob::Base
  def perform
    # you can pause this job from running by executing `CanDisableJob.disable!` (which will cause the job to be re-enqueued),
    # or have it be dropped entirely via `CanDisableJob.disable!(drop: true)`
    # enable it again via `CanDisableJob.enable!`


After checking out the repo, run

to install dependencies. Then, run
rake test
to run the tests. You can also run
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
, and then run
bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the
file to


Bug reports and pull requests are welcome on GitHub at Please look at the

for the style guide.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.