NAME
RateLimitations::Pluggable - pluggabe manager of per-service rate limitations
STATUS
SYNOPSIS
my $storage = {};
my $rl = RateLimitations::Pluggable->new({
    limits => {
        sample_service => {
            60   => 2,  # per minute limits
            3600 => 5,  # per hour limits
        }
    },
    # define an subroutine where hits are stored: redis, db, file, in-memory, cookies
    getter => sub {
        my ($service, $consumer) = @_;
        return $storage->{$service}->{$consumer};
    },
    # optional, notify back when hits are updated
    setter => sub {
        my ($service, $consumer, $hits) = @_;
        $storage->{$service}->{$consumer} = $hits;
    },
});
$rl->within_rate_limits('sample_service', 'some_client_id');  # true!
$rl->within_rate_limits('sample_service', 'some_client_id');  # true!
$rl->within_rate_limits('sample_service', 'some_client_id'),  # false!
DESCRIPTION
The module access to build-in time function every time you invoke within_rate_limits method, and checks whether limits are hits or not.
Each time the method within_rate_limits is invoked it appends to the array of hit current time. It check that array will not grow endlessly, and holds in per $service (or per $service/$consumer) upto max_time integers.
The array can be stored anywhere (disk, redis, DB, in-memory), hence the module name is.
ATTRIBUTES
limits
Defines per-service limits. Below
{
    service_1 => {
        60   => 20,    # up to 20 service_1 invocations per 1 minute
        3600 => 50,    # OR up to 50 service_1 invocations per 1 hour
    },
    service_2 => {
        60   => 25,
        3600 => 60,
    }
}
Mandatory.
getter->($service, $consumer)
Mandatory coderef which returns an array of hits for the service and some consumer.
setter->($service, $consumer, $hits)
Optional callback for storing per service/consumer array of hits.
METHODS
within_rate_limits
within_rate_limits($service, $consumer)
Appends service/consumer hits array with additional hit.
Returns true if the service limits aren't exhausted.
The $service string must be defined in the limits attribute; the $consumer string is arbitrary object defined by application logic. Cannot be undef
SOURCE CODE
AUTHOR
binary.com, <perl at binary.com>
BUGS
Please report any bugs or feature requests to https://github.com/binary-com/perl-RateLimitations-Pluggable/issues.