Class: Aikido::Zen::RateLimiter

Inherits:
Object
  • Object
show all
Defined in:
lib/aikido/zen/rate_limiter.rb

Overview

Keeps track of all requests in this process, broken up by Route and further discriminated by client. Provides a single method that checks if a certain Request needs to be throttled or not.

Defined Under Namespace

Classes: Breaker, Bucket, Result

Instance Method Summary collapse

Constructor Details

#initialize(config: Aikido::Zen.config, settings: Aikido::Zen.runtime_settings) ⇒ RateLimiter

Returns a new instance of RateLimiter.



13
14
15
16
17
18
19
20
# File 'lib/aikido/zen/rate_limiter.rb', line 13

def initialize(
  config: Aikido::Zen.config,
  settings: Aikido::Zen.runtime_settings
)
  @config = config
  @settings = settings
  @buckets = {}
end

Instance Method Details

#calculate_rate_limits(request) ⇒ Aikido::Zen::RateLimiter::Result?

Calculate based on the configuration whether a request will be rate-limited or not.

Parameters:

Returns:



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/aikido/zen/rate_limiter.rb', line 27

def calculate_rate_limits(request)
  route, settings = @settings.endpoints.match(request.route)

  rate_limit_settings = settings&.rate_limiting

  return nil unless rate_limit_settings&.enabled?

  bucket = nil

  synchronize do
    bucket = @buckets[route]

    if bucket.nil? || bucket.settings_changed?(rate_limit_settings)
      bucket = Bucket.new(
        ttl: rate_limit_settings.period,
        max_size: rate_limit_settings.max_requests,
        settings: rate_limit_settings
      )

      @buckets[route] = bucket
    end
  end

  key = @config.rate_limiting_discriminator.call(request)
  bucket.increment(key)
end