# bad - limiter is re-created on each job call
class SomeJob < ApplicationJob
def perform(...)
limiter = Sidekiq::Limiter.concurrent('erp', 50, wait_timeout: 0, lock_timeout: 30)
limiter.within_limit do
# call ERP
end
end
end
# good
class SomeJob < ApplicationJob
ERP_LIMIT = Sidekiq::Limiter.concurrent('erp', 50, wait_timeout: 0, lock_timeout: 30)
def perform(...)
ERP_LIMIT.within_limit do
# call ERP
end
end
end
# acceptable - an exception is when the limiter is specific to something, and that is used as a distinction key in limiter name.
class SomeJob < ApplicationJob
def perform(user)
# Rate limiting is per user account
user_throttle = Sidekiq::Limiter.bucket("stripe-#{user.id}", 30, :second, wait_timeout: 0)
user_throttle.within_limit do
# call stripe with user's account creds
end
end
end