Skip to main content

Test

LimitLion

A token bucket rate limiting throttle using Redis as the backend. Inspired by Stripe's Scaling your API with rate limiters blog post. Can be used to control processing rates from one to many processes. Potential implementations include protecting databases from high processing rates, orchestrating queue consumer processes, or enforcing HTTP request rate limits.

Install with: pip install limitlion

Following is a simple example of a throttle named test that allows 5 requests per second (RPS) with a burst factor of 2 using a 8 second window and requesting 1 token (default) for each unit of work. Look in the examples directory for more.

redis = redis.Redis('localhost', 6379)
throttle_configure(redis)
while True:
    allowed, tokens, sleep = throttle('test', 5, 2, 8)
    if allowed:
        print ('Do work here')
    else:
        print ('Sleeping {}'.format(sleep))
        time.sleep(sleep)

Design

The rate limiting logic uses a classic token bucket algorithm but is implemented entirely as a Lua Redis script. It leverages the Redis TIME command which ensures fair microsecond resolution across all callers independent of the caller's clock. Note that buckets start and end on whole seconds.

Redis 3.2+ is required because replicate_commands() is used to support using the TIME command in a Lua script.

Configuring

Default values for RPS, burst factor and window size are supplied to the throttle Lua script. The Lua script creates a throttle:[throttle name]:knobs hash with these values if it does not yet exist in Redis. The script then uses the values in that knobs hash for the token bucket calculations. Each call also sets the TTL for the knobs key to 7 days so it will remain in Redis as long as the throttle has been active in the last week.

Since these settings are stored in Redis a separate process can be used to adjust them on the fly. This could simply be manually issuing the Redis command to change the RPS or a more sophisicated process that polls Prometheus metrics to determine the current load on your database and adjust the RPS accordingly.

Running Counter

Another small but useful tool to keep track of counts in Redis for specified time windows. These counts can then be used to make decisions on limiting or failing processes as well as for diagnostics. Checkout running_counter.py for details.

Metadata

Release files for limitlion 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for limitlion 1.1.0
File Size Uploaded Provenance Actions
limitlion-1.1.0.tar.gz 15.8 kB Without provenance Details for limitlion-1.1.0.tar.gz

Release files / limitlion-1.1.0.tar.gz

Download URL limitlion-1.1.0.tar.gz
Size 15.8 kB
Tags Source
SHA-256 checksum
How to use checksums
8786f5ace2c9d35d2c6ab0605804ae37d415d6c7bc6710f233daebbea09660d0
BLAKE2b-256 checksum
How to use checksums
649457d17f3873321f4e78b92780238c291df13d748e1aff7056d5c35b3b7977
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.8

Security for limitlion 1.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page