Rust中的速率限制:用于限制请求频率的库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust中的速率限制:高效的负载管理



速率限制(Rate limiting)是保护及优化Web服务、API和网络应用程序的关键机制。在Rust生态系统中,有多个成熟的库实现了各种算法:从经典的令牌桶到现代的自适应方法。本文将解析三个主要库:governor、leaky-bucket和ratelimit,并提供代码示例和选择建议。



1. governor库——黄金标准



governor是最流行且最灵活的速率限制库。它实现了通用信元速率算法(GCRA),能以最小延迟精确遵守限制。支持同步和异步模式,以及用于Actix-web、Axum和Rocket的中间件。



governor基础示例

use governor::{DefaultKeyedRateLimiter, Quota, RateLimiter};use std::num::NonZeroU32;use std::time::Duration;

fn main() { // 允许每秒5个请求 let quota = Quota::per_second(NonZeroU32::new(5).unwrap()); let limiter = RateLimiter::direct(quota);

for i in 0..10 { match limiter.check() { Ok(_) => println!("请求 {} 已允许", i), Err(_) => println!("请求 {} 被拒绝(速率限制)", i), } std::thread::sleep(Duration::from_millis(100)); }}


带等待的异步版本

use governor::{Quota, RateLimiter};use std::num::NonZeroU32;use tokio::time::{sleep, Duration};

#[tokio::main]async fn main() { let limiter = RateLimiter::direct(Quota::per_second( NonZeroU32::new(2).unwrap(), ));

for i in 0..5 { limiter.until_ready().await; println!("已处理请求 {}", i); sleep(Duration::from_millis(300)).await; }}


governor的关键功能:

  • 通过KeyedRateLimiter支持基于键的限制(按IP、按用户)
  • 与HTTP服务器的tower中间件集成
  • 可配置的策略:等待、拒绝、自适应减速
  • 内存占用极低(每个限制器一个原子计数器)


2. leaky-bucket库——简单可靠



leaky-bucket实现了经典的“漏桶”算法。它非常适合平滑峰值负载,当需要保证均匀的请求流时。该库轻量级且无需外部依赖。



leaky-bucket示例

use leaky_bucket::RateLimiter;use std::time::Duration;

#[tokio::main]async fn main() { let limiter = RateLimiter::builder() .initial(10) // 初始令牌数 .interval(Duration::from_secs(1)) // 补充间隔 .refill(5) // 每个间隔添加的令牌数 .max(20) // 最大令牌数 .build();

for i in 0..15 { limiter.acquire_one().await; println!("请求 {} 已完成", i); }}


leaky-bucket的特点:

  • 支持异步和阻塞API
  • 可配置“突发”模式(短期峰值)
  • 空闲时自动释放令牌


3. ratelimit库——极简方法



ratelimit是最简单的库,实现了固定间隔的滑动窗口。适用于不需要高精度的简单场景。



ratelimit示例

use ratelimit::Ratelimiter;use std::time::Duration;

fn main() { let mut limiter = Ratelimiter::builder(10, Duration::from_secs(1)) .

推荐