#token-bucket #api-access #rate-limiting #limit #frequency #algorithm #async

async-rate-limiter

实现了一种token bucket算法,可用于限制API访问频率。使用纯Rust编写。

7个版本 (稳定)

1.1.0 2024年8月20日
1.0.3 2024年8月19日
1.0.2 2024年8月17日
0.1.1 2024年8月16日
0.1.0 2024年8月16日

365算法

Download history 533/week @ 2024-08-12

每月533 次下载

自定义许可

23KB
341

async-rate-limiter

crates.io Documentation LICENSE CI

async-rate-limiter实现了一种token bucket算法,可用于限制API访问频率。

特性

  • 简单易用
  • 支持并发访问
  • 低开销,token数量随时间计算

得益于Rust的async / await,此crate非常简单易用。只需将函数调用放在RateLimiter::acquire().await之后,函数将以指定的速率限制被调用。

RateLimiter还实现了Clone特质,因此您可以轻松地在多个任务环境中使用它。

示例

更新您的Cargo.toml

[dependencies]
# Change features to ["rt-async-std"] if you are using async-std runtime.
async-rate-limiter = { version = "1", features = ["rt-tokio"] }

这是一个简单的示例

use async_rate_limiter::RateLimiter;
use std::time::Duration;
use tokio::spawn;

#[tokio::main]
async fn main() {
    let rl = RateLimiter::new(3);
    // You can change `burst` at anytime
    rl.burst(5);
    
    rl.acquire().await;
    println!("Do something that you want to limit the rate ...");

    let res = rl.try_acquire();
    if res.is_ok() {
        println!("Do something that you want to limit the rate ...");
    }

    // acquire with a timeout
    let ok = rl.acquire_with_timeout(Duration::from_secs(10)).await;
    if ok {
        println!("Do something that you want to limit the rate ...");
    }

    // Concurrent use
    let rl = rl.clone();
    spawn(async move {
        let res = rl.acquire_with_timeout(Duration::from_millis(340)).await;
        assert!(res);
    });
}

async-rate-limiter支持不同的异步运行时,目前支持tokio & async-std。您可以使用功能切换异步运行时。

依赖关系

~0.6–11MB
~124K SLoC