限制 Nodejs 模块请求的速率

Rate Limit the Nodejs Module Request

所以我正在尝试使用 Request 模块使用 Nodejs 创建数据抓取工具。我想在 20 毫秒的周期内将并发限制为 1 个域,以通过 50,000 个 url。

当我执行代码时,我正在使用我的系统可以访问的 40Gbps 带宽对网络进行 DoS 攻击...这会产生本地问题和远程问题。

5 万个域的 120 毫秒周期的 5 次并发扫描(如果我计算正确)将在大约 20 分钟内完成列表,并且至少不会在远程造成任何问题。

我正在测试的代码:

var urls = // data from mongodb

urls.forEach(fn(url) {
  // pseudo
  request the url
    process
});

forEach 函数立即执行 "queueing" 所有 url 并尝试获取所有。似乎不可能在每个循环上进行延迟。所有 google 搜索似乎都显示了如何对 server/api 的传入请求进行速率限制。同样的事情似乎也发生在 for 循环中。无法控制循环执行的速度。我可能遗漏了什么或者代码逻辑错误。有什么建议吗?

  1. 为了简化您的代码实现,请使用 async/await 和 Promises 而不是回调。
  2. 将包 got or axios 用于 运行 承诺的请求。
  3. 使用p-map或类似的方法形式promise-fun

有复制粘贴的例子:

const pMap = require('p-map');

const urls = [
'sindresorhus.com',
'ava.li',
'github.com',
…
];

console.log(urls.length);
//=> 100

const mapper = url => {
return fetchStats(url); //=> Promise
};

pMap(urls, mapper, {concurrency: 5}).then(result => {
console.log(result);
//=> [{url: 'sindresorhus.com', stats: {…}}, …]
});