如何用Rust Governor创建10秒10次请求的限流器?
在Rust中用Governor实现10秒内允许10次请求的限流器
你之前写的代码用了Quota::with_period,这是令牌桶模式的配置——每10秒恢复1个令牌,初始burst设为10意味着一开始有10个令牌,但用完之后每10秒才能再用1次,这确实不是你想要的“每10秒完全重置配额”的效果。
其实Governor本身支持固定窗口限流,完全可以实现你要的需求,不需要每隔10秒替换RateLimiter。正确的做法是用Quota::per_duration来创建配额:
use governor::{Quota, RateLimiter}; use std::time::Duration; use std::num::NonZeroU32; // 创建每10秒允许10次请求的固定窗口配额 let quota = Quota::per_duration( Duration::from_secs(10), NonZeroU32::new(10).unwrap() ).unwrap(); // 初始化限流器 let limiter = RateLimiter::direct(quota);
这个配置的逻辑是:
- 以10秒为一个固定窗口,每个窗口内最多允许10次请求
- 当窗口时间结束后,配额会自动重置为10次,不需要手动重建限流器
简单来说,per_duration就是专门用来定义“每X时间允许Y次请求”的固定窗口策略,而with_period是用于令牌桶的“每X时间恢复1个令牌”的平滑限流策略,选对方法就不用折腾替换限流器了。
内容的提问来源于stack exchange,提问作者LGXerxes
相关产品推荐
相关产品推荐

