因此,我试图使用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循环似乎也发生了同样的事情。无法控制循环执行的速度。我可能缺少某些东西,或者代码逻辑错误。有什么建议吗?
答案 0 :(得分:0)
async/await
和Promises代替回调。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: {…}}, …]
});