activejob-traffic_control

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

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

Installation

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

Usage

ActiveJob::TrafficControl
adds three modules you can mixin to your job classes as needed, or to
ApplicationJob
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 = ConnectionPool.new(size: 5, timeout: 5) { Redis.new } # set poolthresholds as needed
# or, ActiveJob::TrafficControl.client = ConnectionPool.new(size: 5, timeout: 5) { Dalli::Client.new }
# or if not multithreaded, ActiveJob::TrafficControl.client = Redis.new

Throttle

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
Concurrency
, 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

Concurrency

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

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

Disable

For

Disable
, 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!`
  end
end

Development

After checking out the repo, run

bin/setup
to install dependencies. Then, run
rake test
to run the tests. 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/nickelser/activejob-traffic_control. Please look at the

.rubocop.yml
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.