Class: Aikido::Zen::RateLimiter
- Inherits:
-
Object
- Object
- Aikido::Zen::RateLimiter
- 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
-
#calculate_rate_limits(request) ⇒ Aikido::Zen::RateLimiter::Result?
Calculate based on the configuration whether a request will be rate-limited or not.
-
#initialize(config: Aikido::Zen.config, settings: Aikido::Zen.runtime_settings) ⇒ RateLimiter
constructor
A new instance of RateLimiter.
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.
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 |