Skip to content

速率限制与配额

保护你的钱包。单个病毒式传播的用户可能会让你损失数千美元。

1. 令牌桶算法 (Token Bucket)

想象一个桶,每分钟填充 10 个令牌。每个请求消耗 1 个令牌。如果桶空了,拒绝请求。

2. 实现 (Upstash Ratelimit)

Serverless 中最简单的方法。

typescript
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";

const ratelimit = new Ratelimit({
  redis: Redis.fromEnv(),
  limiter: Ratelimit.slidingWindow(10, "10 s"), // 每 10 秒 10 个请求
});

export async function POST(req: Request) {
  const ip = req.headers.get("x-forwarded-for") ?? "127.0.0.1";
  const { success } = await ratelimit.limit(ip);

  if (!success) {
    return new Response("Too many requests", { status: 429 });
  }
}

3. 分层配额

按用户计划区分。

计划限制模型
匿名5 / 天GPT-3.5
免费用户50 / 天GPT-4o-mini
专业用户500 / 天GPT-4o
typescript
const limit = user.isPro ? 500 : 50;
const ratelimit = Ratelimit.slidingWindow(limit, "1 d");

4. 成本控制 (硬限制)

速率限制防止速度过快。配额防止总量过大。 在数据库中跟踪每月的总 Token 使用量,并阻止超出的用户。

typescript
if (user.monthlyTokenUsage > 1_000_000) {
  throw new Error("Monthly limit exceeded. Upgrade to Enterprise.");
}