Class: RuboCop::Cop::SidekiqEnt::LimiterNotReused

Inherits:
Base
  • Object
show all
Defined in:
lib/rubocop/cop/sidekiq_ent/limiter_not_reused.rb

Overview

Checks that rate limiters are created as class constants for reuse.

Creating limiters inside the perform method causes Redis memory leaks because each instance creates new Redis keys. Limiters should be defined as class constants to be reused across job executions.

Examples:

# bad - limiter created inside perform
class MyJob
  include Sidekiq::Job

  def perform
    limiter = Sidekiq::Limiter.concurrent('api', 50)
    limiter.within_limit { call_api }
  end
end

# good - limiter as class constant
class MyJob
  include Sidekiq::Job
  API_LIMITER = Sidekiq::Limiter.concurrent('api', 50, wait_timeout: 0)

  def perform
    API_LIMITER.within_limit { call_api }
  end
end

# good - dynamic limiter name (user-specific)
class MyJob
  include Sidekiq::Job

  def perform(user_id)
    limiter = Sidekiq::Limiter.concurrent("api-#{user_id}", 10)
    limiter.within_limit { call_api_for_user(user_id) }
  end
end

Constant Summary collapse

MSG =
'Create rate limiters as class constants for reuse.'

Instance Method Summary collapse

Methods inherited from Base

#limiter_creation?, #unique_for_option?, #unique_until_option?

Methods included from Sidekiq::Language

#active_job_class?, #perform_call?, #sidekiq_include?, #sidekiq_options_call?

Instance Method Details

#on_send(node) ⇒ Object Also known as: on_csend



46
47
48
49
50
51
52
53
# File 'lib/rubocop/cop/sidekiq_ent/limiter_not_reused.rb', line 46

def on_send(node)
  limiter_creation?(node) do |_method, name, _limit|
    return if inside_class_body_directly?(node)
    return if dynamic_limiter_name?(name)

    add_offense(node)
  end
end