#rate-limiting #algorithm #bucket #leaky #cell #generic #gcra

无 std ratelimit_meter

Rust 中漏桶作为计费器的速率限制实现

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 并发

Download history 45/week @ 2024-01-01 83/week @ 2024-01-08 35/week @ 2024-01-15 29/week @ 2024-01-22 10/week @ 2024-01-29 43/week @ 2024-02-05 51/week @ 2024-02-12 81/week @ 2024-02-19 76/week @ 2024-02-26 135/week @ 2024-03-04 59/week @ 2024-03-11 63/week @ 2024-03-18 49/week @ 2024-03-25 121/week @ 2024-04-01 66/week @ 2024-04-08 109/week @ 2024-04-15

348 每月下载量
用于 5 crates

MIT 许可证

79KB
1K SLoC

Build Status Docs crates.io

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