rate-limiter-flexible 可以按键计数并限制操作次数,在任何规模下防止 DDoS 和暴力攻击。
它支持 Redis、Prisma、DynamoDB、进程 内存、集群 或 PM2、Memcached、MongoDB、MySQL 和 PostgreSQL。
内存限制器也可以在浏览器中使用。
原子递增。 内存或分布式环境中的所有操作都使用原子递增来防止竞态条件。
快速。 在集群中平均请求时间为 0.7ms
,在分布式应用中为 2.5ms
。参见基准测试。
灵活。 可以组合限制器、在一定时间内阻止某个键、延迟操作、使用保险选项管理故障转移、在内存中配置智能键阻塞等等。
适应增长。 它为所有限制器提供统一的 API。无论应用如何增长,它都能应对。只需几分钟即可准备好限制器。
友好。 无论您喜欢使用哪个 node 包:redis
或 ioredis
、sequelize
/typeorm
或 knex
、memcached
、原生驱动或 mongoose
。它都可以与之配合使用。
内存阻塞。 通过 inMemoryBlockOnConsumed 避免额外的存储请求。
使用 BurstyRateLimiter 允许流量突发。
兼容 Deno 参见此示例
它使用固定窗口,因为这比滚动窗口快得多。 点击此处查看与其他库的比较基准测试
npm i --save rate-limiter-flexible
yarn add rate-limiter-flexible
// CommonJS const { RateLimiterMemory } = require("rate-limiter-flexible"); // 或 // ECMAScript import { RateLimiterMemory } from "rate-limiter-flexible"; // 或 import RateLimiterMemory from "rate-limiter-flexible/lib/RateLimiterMemory.js";
可以根据 IP 地址、用户 ID、授权令牌、API 路由或任何其他字符串来消耗点数。
const opts = { points: 6, // 6 点 duration: 1, // 每秒 }; const rateLimiter = new RateLimiterMemory(opts); rateLimiter.consume(remoteAddress, 2) // 消耗 2 点 .then((rateLimiterRes) => { // 已消耗 2 点 }) .catch((rateLimiterRes) => { // 没有足够的点数可消耗 });
如果没有错误,Promise 的 resolve
和 reject
回调都会返回 RateLimiterRes
类的实例。
对象属性:
RateLimiterRes = { msBeforeNext: 250, // 下一次操作可以执行前的毫秒数 remainingPoints: 0, // 当前持续时间内剩余的点数 consumedPoints: 5, // 当前持续时间内已消耗的点数 isFirstInDuration: false, // 是否为当前持续时间内的第一次操作 }
您可能想为响应设置 HTTP 头:
const headers = { "Retry-After": rateLimiterRes.msBeforeNext / 1000, "X-RateLimit-Limit": opts.points, "X-RateLimit-Remaining": rateLimiterRes.remainingPoints, "X-RateLimit-Reset": new Date(Date.now() + rateLimiterRes.msBeforeNext) }
get
、set
、block
、delete
、penalty
和 reward
方法完整文档请见 Wiki
Wiki 上的一些可复制粘贴示例: