Ограничение скорости запроса модуля 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 ответ

Решение
  1. Для упрощения вашей реализации кода используйте async/await и обещания вместо обратных вызовов.
  2. Используйте полученный пакет или axios для выполнения обещанных запросов.
  3. использование 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: {…}}, …]
});
Другие вопросы по тегам