#rate-limiting #sdk #redis #upstash #kv

upstash-ratelimit-rs

一个非官方的 Rust Upstash 速率限制 SDK

3 个稳定版本

1.0.2 2024 年 3 月 30 日
1.0.1 2024 年 3 月 23 日
1.0.0 2024 年 3 月 22 日

#2#ratelimit

Download history 262/week @ 2024-03-19 149/week @ 2024-03-26 75/week @ 2024-04-02

每月 121 次下载

MIT 许可证

25KB
392

非官方的 Rust Upstash 速率限制 SDK

为 Rust 生态系统构建的内存数据存储速率限制 SDK

灵感来源

此速率限制 SDK 受 Upstash 团队创建的官方 TypeScript 速率限制 SDK 的启发。

设置

  1. 要设置速率限制器,首先创建一个 Redis 客户端实例,该实例可以存储给定窗口内的请求计数
let connection_str = std::env::var("UPSTASH_REDIS_URL").unwrap_or_else(|_| panic!("Expecting UPSTASH_REDIS_URL to be set"));
let Ok(redis) = redis::Client::open(connection_str) else {
    panic!("Failed to connect")
};
  1. 使用 Redis 客户端创建一个 RatelimitConfiguration 实例

  2. 使用客户端配置创建三个速率限制算法中的任何一个的新实例

例如:使用固定窗口算法限制 30 秒窗口内的 10 个请求。

let client = RatelimitConfiguration::new(redis, true, Some(String::from("my-custom-prefix")));
let ratelimit = FixedWindow::new(client, 10, "30s");

在上面的客户端配置中,使用临时缓存以避免在请求已被阻止时调用 Redis,并添加自定义前缀字符串将覆盖默认前缀字符串

使用 ratelimit 实例在请求调用中调用限制函数以对您的请求进行速率限制

let limit_response = state.ratelimit.limit("some-unique-identifier-like-ip", None).await;

自定义速率

默认情况下,每个算法在每个请求中消耗一个令牌,但如果您要根据有效负载大小或其他任何因素对请求进行速率限制,则可以通过将速率值提供给限制函数调用来实现

let limit_response = state.ratelimit.limit("some-unique-identifier-like-ip", Some(10)).await;

这将消耗一个请求中的 10 个令牌。

示例

查看 示例 目录

路线图

  • 单个区域(可能存在延迟问题)

    • 固定窗口算法 ✅
    • 滑动窗口算法 ✅
    • 令牌桶算法 ✅
    • 缓存固定窗口算法 🛠️
    • 分析 🛠️
    • 强制超时 🛠️
    • 硬重置 🛠️
  • 多个区域(无延迟问题)

    • 固定窗口算法 🛠️
    • 滑动窗口算法 🛠️

依赖项

~9–20MB
~277K SLoC