Node.js HTTP如何做一个HTTP请求限速?

标签 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 数据库中还是 Mongo 中? 也许有一个内置在内存中的 Node.js 可以更好地保存数据?

你有什么建议?

最佳答案

使用插件没有错。取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 可以很好地处理这些事情。

关于Node.js HTTP如何做一个HTTP请求限速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52251805/

相关文章:

node.js - MEAN.JS : Server username security

node.js - 如何从 Express 应用程序中删除调试?

java - 如何使用 Java 客户端从 Redis 中读取 erlang 术语?

redis - 如何理解 redis-cli 结果与 redis-benchmark 结果

node.js - 从 KOA 中间件内部的 Promise 调用 Yield

node.js - Node-Postgres SELECT WHERE IN动态查询优化

python - 与 Flask 一起安装 Node

node.js - 使用 Mongoose 时如何实现工厂模式?

javascript - 从 Promise 获取数据

javascript - findOneAndUpdate 中的文档未更新