foretoken v0.3.0 Foretoken View Source
An ETS-based implementation of the token bucket algorithm.
Feature & Design
- Simplest possible API (only 1 public interface function:
Foretoken.take/5) - ETS as concurrently accessible bucket storage
Bucket lifecycle management
- On-demand creation of buckets (whch can be disabled)
- Automatic cleanup of unused buckets
Compatibility notes
This package requires Erlang/OTP 20 (or later).
See also Foretoken.Config.
Link to this section Summary
Functions
Tries to take the specified number of token(s) from the bucket identified by bucket
Link to this section Types
reason() ::
{:not_enough_token, milliseconds_to_wait :: pos_integer()}
| :nonexisting_bucket
Link to this section Functions
take(any(), pos_integer(), pos_integer(), pos_integer(), boolean()) :: :ok | {:error, reason()}
Tries to take the specified number of token(s) from the bucket identified by bucket.
If the specified bucket does not exist, it’s created on-demand filled with max_tokens tokens.
If the bucket exists, current number of tokens is computed (using milliseconds_per_token and max_tokens)
and, if available, tokens_to_take tokens are removed from the bucket.
When there are no enough tokens in the bucket this function returns {:error, milliseconds_to_wait},
where milliseconds_to_wait is the duration after which the requested tokens become available.
Note that waiting for milliseconds_to_wait doesn’t guarantee success at the next take/5;
another concurrent process may precede the current process.
Although you can use basically arbitrary term for bucket argument,
atoms with $ and integers (such as :"$1", :"$2", …) are not usable.