View Source Leaky
Implements a token-based rate limiter using the leaky bucket algorithm, ideal for controlling access rates to resources in Elixir applications. This implementation leverages ETS for optimized performance, making it suitable for high-load environments.
Overview
The leaky bucket algorithm helps smooth out bursty traffic by limiting the rate at which actions are taken. It's like a bucket with a hole: tokens, representing permissions to take an action, drip out at a constant rate. If the bucket is full, new actions must wait, ensuring the overall rate does not exceed the desired threshold. Read more about the algorithm here: https://en.wikipedia.org/wiki/Leaky_bucket
Instalation
Add the following to your mix.exs
file:
def deps do
[
{:leaky, "~> 0.1.1"},
]
end
Usage
The rate limiter process can be customized with several options:
bucket_name
: Unique identifier for the bucket.max_accumulated
: The maximum tokens the bucket can hold. Once full, new tokens will not accumulate.refill
: The number of tokens added to the bucket on each refill cycle.interval
: The time (in ms) between each refill cycle. Defaults to 1000 ms.name
: The GenServer process name. Defaults toLeaky
.
configuration = [bucket_name: :user_requests, max_accumulated: 100, refill: 10, interval: 1000]
{:ok, _pid} = Leaky.start_link(configuration)
To attempt an action, checking if it's allowed under the current rate:
case Leaky.acquire(:user_requests, 1) do
{:allow, tokens_left} -> "Action allowed."
:deny ->"Action denied."
end