Skip to main content

Close LimitLion

Project description

CircleCI Maintainability Test Coverage

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.

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

limitlion-0.9.2.tar.gz (7.4 kB view details)

Uploaded Source

Built Distribution

limitlion-0.9.2-py3-none-any.whl (9.8 kB view details)

Uploaded Python 3

File details

Details for the file limitlion-0.9.2.tar.gz.

File metadata

  • Download URL: limitlion-0.9.2.tar.gz
  • Upload date:
  • Size: 7.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.0

File hashes

Hashes for limitlion-0.9.2.tar.gz
Algorithm Hash digest
SHA256 b731e0bf5d09fb4b3fa2014a232bf1bac0f13a1fefb79847cedb4ed651a5a12a
MD5 77e3be7c6f851e6310959854750cadd7
BLAKE2b-256 a0854fa6c7feb5c25e686cbccfb43da07b4bef89837e45464954da24447b8e3a

See more details on using hashes here.

File details

Details for the file limitlion-0.9.2-py3-none-any.whl.

File metadata

  • Download URL: limitlion-0.9.2-py3-none-any.whl
  • Upload date:
  • Size: 9.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.0

File hashes

Hashes for limitlion-0.9.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ac33e681e06427b672bfe3776509b48587433cb78b7833c27e8b75f608b0f93a
MD5 7e2b8bfb12f8c5b572ed88c14c842774
BLAKE2b-256 26e9a1e1319f262271ab946b053ba64ae0ccd484adc194646081e85b4a37f511

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page