The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

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

GitHub

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.