限制Nodejs模块请求的速率

时间:2018-09-20 20:13:51

标签: node.js node-request

因此,我试图使用Request模块与Node.js创建数据抓取工具。我想在20ms的周期内将并发限制为1个域,以访问50,000个网址。

执行代码时,我正在对系统具有访问权限的40Gbps带宽的网络进行DoS处理。这会造成本地问题和远程问题。

在120ms周期内对5万个域进行5次并发扫描(如果我计算正确的话)将在约20分钟内完成列表,至少不会在远程产生任何问题。

我正在测试的代码:

var urls = // data from mongodb

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

forEach函数立即执行“排队”所有URL并尝试获取所有URL。似乎不可能在每个循环上进行延迟。所有的Google搜索似乎都显示了如何对您的服务器/ API的传入请求进行速率限制。 for循环似乎也发生了同样的事情。无法控制循环执行的速度。我可能缺少某些东西,或者代码逻辑错误。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

  1. 为简化代码实现,请使用async/await和Promises代替回调。
  2. 使用软件包gotaxios来运行承诺的请求。
  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: {…}}, …]
});