分布式速率限制器
#typescript #distributedsystems #redis #ratelimiter

介绍

我最近为分布式系统创建了一个速率限制器库,可用于控制和限制特定时间段内的请求数。

这个想法

图书馆背后的想法是创建一个代币的存储桶,以一定的速度补充令牌。每次提出请求时,库都会检查存储桶中是否有足够的令牌。如果有的话,它会删除令牌并允许请求。如果没有,它拒绝请求。

解决方案

我使用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