NAME
RateLimitations - manage per-service rate limitations
SYNOPSIS
use 5.010;
use RateLimitations qw(
rate_limited_services
rate_limits_for_service
within_rate_limits
all_service_consumers
);
# Example using the built-in default "rl_internal_testing" service:
# rl_internal_testing:
# 10s: 2
# 5m: 6
my @rl_services = rate_limited_services();
# ("rl_internal_testing")
my @test_limits = rate_limits_for_service('rl_internal_testing');
# ([10 => 2], [300 => 6])
foreach my $i (1 .. 6) {
my $guy = ($i % 2) ? 'OddGuy' : 'EvenGuy';
my $result = (
within_rate_limits({
service => 'rl_internal_testing',
consumer => $guy,
})) ? 'permitted' : 'denied';
say $result . ' for ' . $guy;
}
# permitted for OddGuy
# permitted for EvenGuy
# permitted for OddGuy
# permitted for EvenGuy
# denied for OddGuy
# denied for EvenGuy
my $consumers = all_service_consumers();
# { rl_internal_testing => ['EvenGuy', 'OddGuy']}
DESCRIPTION
RateLimitations is a module to help enforce per-service rate limits.
The rate limits are checked via a backing Redis store. This persistence
allows for multiple processes to maintain a shared view of resource
usage. Acceptable rates are defined in the
/etc/perl_rate_limitations.yml file.
Several utility functions are provided to help examine the inner state
to help confirm proper operation.
Nothing is exported from this package by default.
FUNCTIONS
within_rate_limits({service => $service, consumer => $consumer_id})
Returns 1 if $consumer_id is permitted further access to $service
under the rate limiting rules for the service; 0 is returned if this
access would exceed those limits.
Will croak unless both elements are supplied and $service is valid.
Note that this call will update the known request rate, even if it is
eventually determined that the request is not within limits. This is
a conservative approach since we cannot know for certain how the
results of this call are used. As such, it is best to use this call
only when legitimately gating service access and to allow a bit of
extra slack in the permitted limits.
verify_rate_limitations_config()
Attempts to load the /etc/perl_rate_limitations.yml file and confirm
that its contents make sense. Parsing the file in much the same way
as importing the module, additional sanity checks are performed on
the supplied rates.
Returns 1 if the file appears to be OK; 0 otherwise.
rate_limited_services()
Returns an array of all known services which have applied rate
limits.
rate_limits_for_service($service)
Returns an array of rate limits applied to requests for a known
$service. Each member of the array is an array reference with two
elements:
[number_of_seconds, number_of_accesses_permitted_in_those_seconds]
all_service_consumers()
Returns a hash reference with all services and their consumers. May
be useful for verifying consumer names are well-formed.
{ service1 => [consumer1, consumer2],
service2 => [consumer1, consumer2],
}
flush_all_service_consumers()
Clears the full list of consumers. Returns the number of items
cleared.
CONFIG FILE FORMAT
The services to be limited are defined in the
/etc/perl_rate_limitations.yml file. This file should be laid out as
follows:
service_name:
time: count
time: count
service_name:
time: count
time: count
service_name is an arbitrary string to uniquely identify the service
time is a string which can be interpreted by Time::Duration::Concise.
This may include using an integer number of seconds.
count is an integer which sets the maximum permitted service_name
accesses per time
AUTHOR
Binary.com <
[email protected]>
COPYRIGHT
Copyright 2015-
LICENSE
This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
SEE ALSO