Skip to content

nickelser/activejob-traffic_control

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
bin
 
 
lib
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

Rate controls for your ActiveJobs, 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.

About

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

Resources

Stars

Watchers

Forks

Packages

No packages published