17 个版本 (8 个稳定版)
5.0.0 | 2019 年 9 月 30 日 |
---|---|
4.1.1 | 2019 年 3 月 20 日 |
4.0.1 | 2018 年 10 月 26 日 |
3.0.0 | 2018 年 10 月 20 日 |
0.5.0 | 2017 年 10 月 9 日 |
#338 in 并发
348 每月下载量
用于 5 crates
79KB
1K SLoC
Rust 中使用漏桶进行速率限制
本 crate 在 Rust 中实现了两种速率限制算法
- 一种漏桶算法,以及
- 一种基于漏桶的变体,用于速率限制和调度的 通用单元速率算法 (GCRA)。
ratelimit_meter
可在 no_std
模式下使用,但功能方面会有一些权衡。
安装
将 crate ratelimit_meter
添加到您的 Cargo.toml
文件中;crates.io 页面 可以提供您需要粘贴的确切内容。
API 文档
在 docs.rs 上找到最新版本的文档!
设计和实现
与其他一些令牌桶算法不同,GCRA 假设所有工作单元都是相同的“权重”,因此可以进行一些优化,从而产生更简洁、更快速的代码(甚至在单个单元决策的“热”路径上也不使用乘法或除法)。
本 crate 中的所有速率限制算法实现都是线程安全的。以下是关于重复决策的一些基准测试(在我的 MacBook Pro 上运行,这将因硬件而异等等)
$ cargo bench
Finished release [optimized] target(s) in 0.16s
Running target/release/deps/ratelimit_meter-9874176533f7e1a0
running 1 test
test test_wait_time_from ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out
Running target/release/deps/criterion-67011381a5f6ed00
multi_threaded/20_threads/GCRA
time: [1.9664 us 2.0747 us 2.1503 us]
thrpt: [465.04 Kelem/s 482.00 Kelem/s 508.55 Kelem/s]
Found 10 outliers among 100 measurements (10.00%)
4 (4.00%) low severe
4 (4.00%) low mild
2 (2.00%) high mild
multi_threaded/20_threads/LeakyBucket
time: [2.4536 us 2.4878 us 2.5189 us]
thrpt: [396.99 Kelem/s 401.96 Kelem/s 407.56 Kelem/s]
Found 8 outliers among 100 measurements (8.00%)
5 (5.00%) low severe
3 (3.00%) low mild
single_threaded/1_element/GCRA
time: [68.613 ns 68.779 ns 68.959 ns]
thrpt: [14.501 Melem/s 14.539 Melem/s 14.575 Melem/s]
Found 13 outliers among 100 measurements (13.00%)
9 (9.00%) high mild
4 (4.00%) high severe
single_threaded/1_element/LeakyBucket
time: [64.513 ns 64.855 ns 65.272 ns]
thrpt: [15.321 Melem/s 15.419 Melem/s 15.501 Melem/s]
Found 16 outliers among 100 measurements (16.00%)
4 (4.00%) high mild
12 (12.00%) high severe
single_threaded/multi_element/GCRA
time: [96.461 ns 96.976 ns 97.578 ns]
thrpt: [102.48 Melem/s 103.12 Melem/s 103.67 Melem/s]
Found 11 outliers among 100 measurements (11.00%)
4 (4.00%) high mild
7 (7.00%) high severe
single_threaded/multi_element/LeakyBucket
time: [69.500 ns 70.359 ns 71.349 ns]
thrpt: [140.16 Melem/s 142.13 Melem/s 143.88 Melem/s]
Found 9 outliers among 100 measurements (9.00%)
6 (6.00%) high mild
3 (3.00%) high severe
no-op single-element decision
time: [23.755 ns 23.817 ns 23.883 ns]
Found 11 outliers among 100 measurements (11.00%)
5 (5.00%) high mild
6 (6.00%) high severe
no-op multi-element decision
time: [22.772 ns 22.940 ns 23.125 ns]
Found 5 outliers among 100 measurements (5.00%)
5 (5.00%) high mild
欢迎贡献!
我非常希望这个项目能给人带来使用速率限制技术的乐趣。你可以用这些技术做很多事情(从限制 API 请求到确保你不会因同一件事而频繁发送电子邮件)!
所以,如果你对 API 设计、内部结构有任何想法,或者你想实现其他速率限制算法,我将非常高兴得到你的反馈。有关详细信息,请参阅 CONTRIBUTING.md!
依赖关系
~16–530KB