Convex 限速器组件
注: Convex 组件目前在β中
应用级别税率限制.
- 类型安全
- 用于固定窗口或符号桶算法的配置
- 高效存储和计算
- 可伸缩性可配置硬化
- 交易评价
- 通过信用"保留"获得公平性担保
- 通过“token buckle”配置的“滚动”或“burst”津贴
- 失败已关闭, 不打开
定义:
const rateLimiter = new RateLimiter(components.ratelimiter, {
// One global / singleton rate limit, using a "fixed window" algorithm.
freeTrialSignUp: { kind: "fixed window", rate: 100, period: HOUR },
// A per-user limit, allowing one every ~6 seconds.
// Allows up to 3 in quick succession if they haven't sent many recently.
sendMessage: { kind: "token bucket", rate: 10, period: MINUTE, capacity: 3 },
failedLogins: { kind: "token bucket", rate: 10, period: HOUR },
// Use sharding to increase throughput without compromising on correctness.
llmTokens: { kind: "token bucket", rate: 40000, period: MINUTE, shards: 100 },
llmRequests: { kind: "fixed window", rate: 3, period: MINUTE },
});
用法 :
// Restrict how fast free users can sign up to deter bots
const status = await rateLimiter.limit(ctx, "freeTrialSignUp");
// Limit how fast a user can send messages
const status = await rateLimiter.limit(ctx, "sendMessage", { key: userId });
// Automatically throw an error if the rate limit is hit
await rateLimiter.limit(ctx, "failedLogins", { key: userId, throws: true });
// Consume multiple in one request to prevent rate limits on an LLM API.
const status = await rateLimiter.limit(ctx, "llmTokens", { count: tokens });
// Reserve future capacity instead of just failing now
if (!args.skipCheck) {
const status = await rateLimiter.limit(ctx, "llmRequests", { reserve: true });
if (status.retryAfter) {
return ctx.scheduler.runAfter(status.retryAfter, internal.foo.bar, {
skipCheck: true,
});
}
}
// Check a rate limit without consuming it
const status = await rateLimiter.check(ctx, "failedLogins", { key: userId });
// Reset a rate limit on successful login
await rateLimiter.reset(ctx, "failedLogins", { key: userId });
// Use a one-off rate limit config (when not named on initialization)
const config = { kind: "fixed window", rate: 1, period: SECOND };
await rateLimiter.limit(ctx, "oneOffName", { config, throws: true });
见 本条 更多信息.
预先要求: Convex
你需要一个现有的 Convex 项目来使用组件. Convex是一个主机后端平台,包括数据库,无服务器功能, 还要多学一吨 这里。 。 。 .
运行 npm create convex 或遵循其中任何一条 快速启动 来设置一个.
安装
安装组件包 :
npm install @convex-dev/ratelimiter
创建一个 convex.config.ts 应用程序中的文件 convex/ 通过调用文件夹并安装组件 use数字 :
// convex/convex.config.ts
import { defineApp } from "convex/server";
import ratelimiter from "@convex-dev/ratelimiter/convex.config";
const app = defineApp();
app.use(ratelimiter);
export default app;
使用量
定义利率限制 :
import { RateLimiter } from "@convex-dev/ratelimiter";
import { components } from "./_generated/api";
const rateLimiter = new RateLimiter(components.ratelimiter, {
// One global / singleton rate limit
freeTrialSignUp: { kind: "fixed window", rate: 100, period: HOUR },
sendMessage: { kind: "token bucket", rate: 10, period: MINUTE, capacity: 3 },
});
- 如果您想要定义不同的 不同地点的费率.
使用从突变或动作:
const { ok, retryAfter } = await rateLimiter.limit(ctx, "freeTrialSignUp");
或者如果您想要根据密钥进行评分限制 :
await rateLimiter.limit(ctx, "sendMessage", { key: user._id, throws: true });
此调用也会发出例外,所以不需要检查返回值.
看看这里的完整例子。 。 。 .
见 本条 更多信息 关于使用和先进模式.