Node.js HTTP如何做HTTP请求速率限制?

时间:2018-09-10 05:51:07

标签: node.js mongodb redis rate-limiting

我想为我的快速http处理创建一个限速中间件,如下所示:

app.post("/v1/authentication/login", rateLimiter(5, 20), require('./api/v1-login'));

哪个中间件在20秒内仅允许5个请求。

我可以为此使用插件,但是我也正在使用集群/进程,并且我已经阅读到该插件不支持进程。

我知道我可以使用数据库-MongoDB或Redis在进程之间共享数据。

此外,我想设置一个自定义的速率限制-例如,对于功能A,我希望允许用户John每20秒请求5次, 但是,对于相同的功能,我希望允许Dani每20秒发送10个请求。

我还需要将它应用于我之前提到的所有过程中。

我考虑过编写自己的脚本来保存请求用户的数据,但是我不知道该保存什么-他的IP?他的Chrome序列号或以前的序列号..?

我应该将其存储在Redis DB或Mongo中吗? 也许有一个内置在内存中的Node.js更好地代替了保存数据?

您推荐什么?

3 个答案:

答案 0 :(得分:1)

使用插件没有错。以express-rate-limitRedis Store为例,您可以为每个用户IP限制整个应用的速率,并将其存储在Redis中:

const rateLimit = require("express-rate-limit");
const RedisStore = require('rate-limit-redis');
app.use(rateLimit({
  store: new RedisStore({ /* ... config */ });
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100 // limit each IP to 100 requests per windowMs
});

或者您可以只限制给定的端点:

const someApiLimiter = rateLimit({
  windowMs: 5 * 60 * 1000,
  max: 12,
});
app.use('/api/some', someApiLimiter);

默认情况下使用req.ip,但是您可以提供keyGenerator函数,并使用req.ipreq.user._id的组合。因此,您可以覆盖所有方面。

我建议将Redis用于这些事情,因为您需要快速处理大量小数据,Redis可以很好地完成这些事情。

答案 1 :(得分:0)

我建议像Facebook的API一样实现基于令牌的身份验证。这样,您可以监视谁在使用API​​,并识别每个用户。

实施该操作后,您可以根据喜欢的时间段内正在调用API的用户(拥有令牌的用户)开始限制调用。

答案 2 :(得分:0)

rate-limiter-flexible可以为不同的用户设置不同的限制。

它可以在没有任何DB,MongoDB或Redis的Cluster中工作。

login endpoints protection here

上了解有关登录端点保护的信息。