#rate-limiting #cloudflare-workers #worker #sliding-window #serverless #general #algorithm

worker-ratelimit

适用于Cloudflare Workers的通用速率限制库

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日

#177WebAssembly

Download history 119/week @ 2024-08-16

每月119次下载

MIT/Apache

11KB
187

worker-ratelimit crates.io docs.rs

这是一个适用于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