NAME

PAGI::Middleware::RateLimit - Request rate limiting middleware

SYNOPSIS

use PAGI::Middleware::Builder;

my $app = builder {
    enable 'RateLimit',
        requests_per_second => 10,
        burst => 20,
        key_generator => sub  {
    my ($scope) = @_; $scope->{client}[0] };
    $my_app;
};

DESCRIPTION

PAGI::Middleware::RateLimit implements token bucket rate limiting per client. Clients exceeding the rate limit receive 429 Too Many Requests.

CONFIGURATION

  • requests_per_second (default: 10)

    Average requests allowed per second.

  • burst (default: 20)

    Maximum burst size (bucket capacity).

  • key_generator (default: client IP)

    Coderef to generate rate limit key from $scope.

  • backend (default: in-memory)

    Rate limit storage backend. Can be 'memory' or a custom object implementing get/set methods.

RATE LIMITING ALGORITHM

This middleware uses the token bucket algorithm:

  • Each client has a "bucket" that holds tokens

  • Tokens are added at a constant rate (requests_per_second)

  • The bucket has a maximum capacity (burst)

  • Each request consumes one token

  • If no tokens available, request is rejected

This allows short bursts of traffic while maintaining an average rate.

SEE ALSO

PAGI::Middleware - Base class for middleware