1 个不稳定版本
0.1.1 | 2022年4月26日 |
---|---|
0.1.0 |
|
#4 在 #governor
每月下载 39 次
在 dns-server 中使用
13KB
106 行
prob-rate-limiter
ProbRateLimiter
是一个 概率性 速率限制器。当负载接近配置的限制时,该结构会随机选择接受或拒绝每个请求。它调整拒绝的概率,使吞吐量在限制周围保持稳定。
用例
- 释放负载以防止过载
- 避免过载依赖的服务
- 控制成本
功能
- 小巧,使用44字节
- 100%测试覆盖率
- 优化:每个检查32纳秒,i5-8259U每秒31M次检查
- 无
unsafe
或不可靠依赖
限制
- 需要可变引用。
- 不公平。对待所有请求一视同仁,无论来源。过载服务器的客户端将消耗大部分吞吐量。
替代方案
- r8limit
- 使用滑动窗口
- 无
unsafe
或依赖 - 优化:每个检查48纳秒,i5-8259U每秒21M次检查
- 需要可变引用。
- governor
- 使用不可变引用,易于在线程之间共享
- 受欢迎
- 良好的文档
- 优化:i5-8259U每个检查29纳秒。
- 不必要的
unsafe
- 使用非标准互斥锁库
parking_lot
- 使用复杂的算法
- 漏桶
- 异步任务可以等待其使用资源的轮次。
- 不适用于负载释放,因为没有
try_acquire
。
相关Crates
- safe-dns 使用此
示例
let mut limiter = ProbRateLimiter::new(10.0).unwrap();
let mut now = Instant::now();
assert!(limiter.check(5, now));
assert!(limiter.check(5, now));
now += Duration::from_secs(1);
assert!(limiter.check(5, now));
assert!(limiter.check(5, now));
now += Duration::from_secs(1);
assert!(limiter.check(5, now));
assert!(limiter.check(5, now));
now += Duration::from_secs(1);
assert!(limiter.check(5, now));
assert!(limiter.check(5, now));
now += Duration::from_secs(1);
assert!(limiter.check(5, now));
assert!(limiter.check(5, now));
assert!(!limiter.check(5, now));
Cargo Geiger 安全报告
Metric output format: x/y
x = unsafe code used by the build
y = total unsafe code found in the crate
Symbols:
🔒 = No `unsafe` usage found, declares #![forbid(unsafe_code)]
❓ = No `unsafe` usage found, missing #![forbid(unsafe_code)]
☢️ = `unsafe` usage found
Functions Expressions Impls Traits Methods Dependency
0/0 0/0 0/0 0/0 0/0 🔒 prob-rate-limiter 0.1.1
0/0 0/0 0/0 0/0 0/0 🔒 └── oorandom 11.1.3
0/0 0/0 0/0 0/0 0/0
变更日志
- v0.1.1 - 简化
new
。添加更多文档。 - v0.1.0 - 初始版本
待办事项
- 发布
- 添加基准测试的图表。
许可证:Apache-2.0
依赖项
~32KB