12 个不稳定版本 (5 个破坏性更改)

0.6.0 2024 年 8 月 1 日
0.5.0 2024 年 5 月 28 日
0.4.1 2024 年 5 月 10 日
0.4.0 2023 年 3 月 10 日
0.3.2 2022 年 7 月 20 日

算法 中排名第 173

Download history 4754/week @ 2024-04-29 2261/week @ 2024-05-06 5057/week @ 2024-05-13 13425/week @ 2024-05-20 5975/week @ 2024-05-27 4928/week @ 2024-06-03 11265/week @ 2024-06-10 4147/week @ 2024-06-17 6802/week @ 2024-06-24 5578/week @ 2024-07-01 5963/week @ 2024-07-08 1567/week @ 2024-07-15 4130/week @ 2024-07-22 3343/week @ 2024-07-29 3500/week @ 2024-08-05 7121/week @ 2024-08-12

每月下载量 18,097

MIT 许可证 MIT

36KB
779 行 代码

Build Status License Documentation crates.io

GCRA:基本实现

一个库,它在 Rust 中实现了核心 GCRA 功能。

特性

  • rate-limiter 一个 LRU + 过期速率限制器。实现 Send + Sync,因此可以异步使用。

用法

use gcra::{RateLimit, RatelimitGuard};

fn check_rate_limit() {
    const LIMIT: u32 = 1;
    // Create a rate limit that allows `1/1s`
    let rate_limit = RateLimit::per_sec(LIMIT);
    let mut rate_limit_guard = RateLimitGuard::new_state(rate_limit);

    assert!(rate_limit_guard.check_and_modify(1).is_ok());
    assert!(
        rate_limit_guard.check_and_modify(1).is_err(),
        "We should be over the limit now"
    );
}

使用 rate-limiter

use std::sync::Arc;
use gcra::{GcraError, RateLimit, RateLimiter};

#[tokio::main]
async fn main() -> Result<(), GcraError> {
    let rate_limit = RateLimit::per_sec(2);
    let rate_limiter = Arc::new(RateLimiter::new(4));

    rate_limiter.check("key", &rate_limit, 1).await?;
    rate_limiter.check("key", &rate_limit, 1).await?;

    match rate_limiter.check("key", rate_limit.clone(), 1).await {
        Err(GcraError::DeniedUntil { next_allowed_at }) => {
            print!("Denied: Request next at {:?}", next_allowed_at);
            Ok(())
        }
        unexpected => panic!("Opps something went wrong! {:?}", unexpected),
    }
}

依赖项

~0.3–5.5MB
~21K SLoC