4个版本 (破坏性更新)
新版本 0.4.0 | 2024年8月19日 |
---|---|
0.3.0 | 2024年4月4日 |
0.2.0 | 2024年3月28日 |
0.1.0 | 2024年3月16日 |
#177 在 WebAssembly
每月119次下载
11KB
187 行
worker-ratelimit
这是一个适用于Cloudflare Workers的通用速率限制库。它基于Cloudflare Workers KV进行存储。
该库旨在编译为WebAssembly并在Cloudflare的无服务器平台上执行。请注意,这不是官方的Cloudflare项目,并实现非原子性速率限制,基于尽力而为的原则,这意味着它可能无法计数一些快速连续发生的行为。用户可能会略微超过配置的限制,但一旦达到限制,则限制生效。速率限制通过基于BTree的滑动窗口算法实现。
该库旨在与免费层的功能一起使用。对于更严肃的使用,请务必考虑“安全 > WAF > 速率限制规则”设置。
用法
配置一个包含您的规则的RateLimiter
结构。
use worker_ratelimit::RateLimiter;
pub fn setup_ratelimiter() -> RateLimiter {
// Use the `ratelimit/<key>` namespace within the KV store
let mut limits = RateLimiter::new("ratelimit");
// Allow no more than 2 actions within 5 seconds
limits.add_limit(Duration::from_secs(5), 2);
// Allow no more than 10 actions within 1 minute
limits.add_limit(Duration::from_secs(60), 10);
// Allow no more than 50 actions within 1 hour
limits.add_limit(Duration::from_secs(3600), 50);
limits
}
如下与您的KV支持的速率限制交互
let ratelimits = setup_ratelimiter();
// Get the request ip address
let ip_addr = req.headers().get("x-real-ip")?.unwrap_or_else(String::new);
// Check the rate-limit thresholds (also providing the current time)
let Permit::Allow(ticket) = ratelimits.check_kv(&kv, &ip_addr, &Date::now()).await? else {
return Response::error("Rate limit exceeded", 429);
};
/* Perform the action */
do_something().await?;
// Increase the ratelimit counter (if needed)
if let Some(ticket) = ticket {
ticket.redeem(&kv).await?;
}
许可证
MIT 或Apache-2.0
依赖关系
~1.5–5.5MB
~103K SLoC