#tokens #rate-limiting #token-bucket #limiter #leaky-bucket

leaky-bucket-lite

Slimmed down, lazy futures-aware rate limiter implementation

15 releases (4 breaking)

0.5.2 Feb 17, 2022
0.5.1 Dec 26, 2021
0.4.0 Dec 26, 2021
0.3.2 Sep 23, 2021
0.1.4 Jan 20, 2021

#8 in #token-bucket

Download history 413/week @ 2024-07-26 301/week @ 2024-08-02 344/week @ 2024-08-09 215/week @ 2024-08-16 323/week @ 2024-08-23 428/week @ 2024-08-30 196/week @ 2024-09-06 321/week @ 2024-09-13 281/week @ 2024-09-20 288/week @ 2024-09-27 154/week @ 2024-10-04 193/week @ 2024-10-11 192/week @ 2024-10-18 209/week @ 2024-10-25 223/week @ 2024-11-01 69/week @ 2024-11-08

738 downloads per month
Used in 3 crates (via rosu-v2)

MIT/Apache

31KB
485 lines

leaky-bucket-lite

docs badge crates badge actions badge

A token-based rate limiter based on the leaky bucket algorithm, mainly a lazy reimplementation of udoprog's leaky-bucket with less dependencies and overhead.

If the tokens are already available, the acquisition will be instant through a fast path, and the acquired number of tokens will be added to the bucket.

If they aren't, the task that tried to acquire the tokens will be suspended until the required number of tokens has been added.

Usage

Add the following to your Cargo.toml:

leaky-bucket-lite = "0.4"

Features

leaky-bucket-lite provides 3 implementations:

For potential performance increase with sync-threadsafe or tokio using parking_lot's locking objects, enable the parking_lot feature.

Example

use leaky_bucket_lite::LeakyBucket;
use std::time::Duration;

#[tokio::main]
async fn main() {
    let rate_limiter = LeakyBucket::builder()
        .max(5)
        .tokens(0)
        .refill_interval(Duration::from_secs(1))
        .refill_amount(1)
        .build();

    println!("Waiting for permit...");
    // should take about 5 seconds to acquire.
    rate_limiter.acquire(5).await;
    println!("I made it!");
}

Dependencies

~2–8MB
~49K SLoC