Ограничение скорости запроса модуля Nodejs
Поэтому я пытаюсь создать скребок данных с Nodejs с помощью модуля Request. Я бы хотел ограничить параллелизм 1 доменом в цикле 20 мс, чтобы пройти 50 000 URL.
Когда я выполняю код, я делаю сеть с пропускной способностью 40 Гбит / с, к которой у моей системы есть доступ... Это создает локальные проблемы и проблемы удаленного доступа.
5 одновременных сканирований в цикле 120 мс для доменов 50 КБ (если я правильно рассчитал) завершат список через ~20 минут и по крайней мере не создадут никаких проблем удаленно.
Код, с которым я тестирую:
var urls = // data from mongodb
urls.forEach(fn(url) {
// pseudo
request the url
process
});
Функция forEach мгновенно выполняет "постановку в очередь" всех URL-адресов и пытается извлечь все. Кажется невозможным сделать задержку на каждом цикле. Все поиски в Google показывают, как ограничить входящий запрос на ваш сервер / API. То же самое происходит и с циклом for. Невозможно контролировать скорость выполнения циклов. Возможно, я что-то упустил или кодовая логика неверна Какие-либо предложения?
1 ответ
- Для упрощения вашей реализации кода используйте
async/await
и обещания вместо обратных вызовов. - Используйте полученный пакет или axios для выполнения обещанных запросов.
- использование
p-map
или подобный подход форма обещание-весело
Вот пример с копией:
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: {…}}, …]
});