介绍
我最近为分布式系统创建了一个速率限制器库,可用于控制和限制特定时间段内的请求数。
这个想法
图书馆背后的想法是创建一个代币的存储桶,以一定的速度补充令牌。每次提出请求时,库都会检查存储桶中是否有足够的令牌。如果有的话,它会删除令牌并允许请求。如果没有,它拒绝请求。
解决方案
我使用REDIS作为分布式存储系统实现了令牌存储算法。该库称为dist-rate
,采用一个选项对象,其中包括令牌存储桶中的令牌数,补充令牌的持续时间以及用于分布式锁定和存储的Redis客户端的实例。
用法
要在项目中使用dist-rate-limiter
库,只需通过NPM安装它:
npm install dist-rate-limiter
要使用软件包,请创建一个DistRate
类的实例,然后调用每个请求的唯一ID的execute()
方法。该方法返回布尔值,指示是否允许请求。
import IORedis from "ioredis";
import { DistRate } from "distrate";
const redisClient = new IORedis.Cluster([...]);
const rateLimiter = new DistRate({
tokens: 10,
duration: 60,
redisClient,
});
const allowed = await rateLimiter.execute("user123");
然后,您可以使用Ratelimiter实例来控制和限制对API或服务器的请求数。
链接
dist-rate库可在GitHub和NPM上使用。您可以在此处找到GitHub存储库:
github -https://github.com/Dhroov7/distRate
npm -https://www.npmjs.com/package/dist-rate