Ограничение скорости запроса модуля Nodejs - PullRequest
0 голосов
/ 20 сентября 2018

Итак, я пытаюсь создать скребок данных с 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 Ответ

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