#rate-limiting #rate #limiter #limit #weighted #throttle

weighted_rate_limiter

加权速率限制器

3 个不稳定版本

0.2.0 2024年7月29日
0.1.1 2024年4月6日
0.1.0 2024年4月6日

#6 in #limiter

Download history 2/week @ 2024-05-20 9/week @ 2024-06-03 172/week @ 2024-07-29

每月172次下载

MIT/Apache

20KB
316

加权速率限制器

一些 API 有使用限制,不同的端点或动作有不同的成本 - 这通常是通过调用者被允许在一定时间内使用一定数量的权重来实现的。这个包允许你实现一个强制执行这些限制的速率限制器 - 更具体地说,是通过排队等待在权重可用时执行的未来。

查看 docs.rs 了解使用方法。

注意事项

这个包非常新,尚未经过彻底测试。


lib.rs:

加权速率限制器

一些 API 有使用限制,不同的端点或动作有不同的成本 - 这通常是通过调用者被允许在一定时间内使用一定数量的权重来实现的。这个包允许你实现一个强制执行这些限制的速率限制器 - 更具体地说,是通过排队等待在权重可用时执行的未来。

示例

在这里,我们创建了一个每秒允许总权重为 2 的速率限制器。然后我们创建了两个未来:一个返回 1,一个返回 "Hello"(注意不同的返回类型)。然后我们使用权重 1 和 2 分别对这些未来进行速率限制。第一个未来将立即执行,而第二个将在权重允许刷新后 1 秒执行。

    let rate_limiter = RateLimiter::new(2, Duration::from_secs(1));
    let start = Instant::now();
    let fut1 = async { println!("Returning 1 at {:?}", Instant::now() - start); 1 };
    let fut2 = async { println!("Returning 'Hello' at {:?}", Instant::now() - start); "Hello!" };
    let rate_limited_fut1 = rate_limiter.rate_limit_future(fut1, 1);
    let rate_limited_fut2 = rate_limiter.rate_limit_future(fut2, 2);
    println!("{:?}", join!(rate_limited_fut1, rate_limited_fut2));

    // Returning 1 at 5.2µs
    // Returning 'Hello' at 1.0004935s
    // (1, "Hello!")

局限性

这个包非常新,尚未在生产环境中测试。

未来是按照它们被速率限制的顺序执行的,而不是按照它们创建的顺序执行的。

依赖关系

~2.6–4MB
~61K SLoC