@geektech/backone-utils
限流
固定窗口 / 滑动窗口 / 令牌桶三种限流策略。
rate-limit 模块提供三种限流策略(固定窗口 / 滑动窗口 / 令牌桶),实现同一 RateLimiter 接口,可互换使用;通过 createRateLimiter 工厂按策略创建。纯内存实现,零运行时依赖,适合单进程内的接口限流 / 防刷。
创建限流器
ts
import { createRateLimiter } from '@geektech/backone-utils';
// 固定窗口:每分钟最多 60 次
const limiter = createRateLimiter({
limit: 60,
windowMs: 60_000,
strategy: 'fixed-window',
});消费配额
ts
const result = limiter.consume(ip); // 按 key 隔离,如 IP、用户 ID
if (!result.allowed) {
throw new HttpError(429, 'Too many requests');
}消费结果
| 字段 | 说明 |
|---|---|
allowed | 本次消费是否被允许 |
remaining | 剩余配额(本次消费后) |
resetAt | 配额重置 / 下一个可用时刻(毫秒时间戳) |
策略对比
| 策略 | 特点 |
|---|---|
fixed-window | 固定时间窗计数,实现简单,窗口边界可能突发 |
sliding-window | 滑动窗口平滑限流,边界更均匀 |
token-bucket | 令牌桶:按速率补充,允许一定突发,适合流量整形 |
选项
| 选项 | 说明 |
|---|---|
limit | 窗口内允许的最大请求数 / 令牌桶容量 |
windowMs | 窗口时长(毫秒);令牌桶下作为补充周期基准 |
strategy | fixed-window(默认)/ sliding-window / token-bucket |
refillPerSecond | 令牌桶每秒补充的令牌数(默认按 limit 在 windowMs 内补满计算) |
提示
与中间件结合:在 backone 的自定义中间件里按 ctx.request.headers.get("x-forwarded-for") 或 IP 取 key 即可实现接口限流。