BBackOne Docsserver · utils · cli
Bun-nativeGitHub ↗
@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窗口时长(毫秒);令牌桶下作为补充周期基准
strategyfixed-window(默认)/ sliding-window / token-bucket
refillPerSecond令牌桶每秒补充的令牌数(默认按 limit 在 windowMs 内补满计算)
提示

与中间件结合:在 backone 的自定义中间件里按 ctx.request.headers.get("x-forwarded-for") 或 IP 取 key 即可实现接口限流。