限制 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 循环中。无法控制循环执行的速度。我可能遗漏了什么或者代码逻辑错误。有什么建议吗?
- 为了简化您的代码实现,请使用
async/await
和 Promises 而不是回调。
- 将包 got or axios 用于 运行 承诺的请求。
- 使用
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: {…}}, …]
});
所以我正在尝试使用 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 循环中。无法控制循环执行的速度。我可能遗漏了什么或者代码逻辑错误。有什么建议吗?
- 为了简化您的代码实现,请使用
async/await
和 Promises 而不是回调。 - 将包 got or axios 用于 运行 承诺的请求。
- 使用
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: {…}}, …]
});