Задержка выполнения нескольких HTTP-запросов в Google Cloud Function - PullRequest
0 голосов
/ 04 октября 2019

Я реализовал веб-скребок с Nodejs, cheerio и request-обещанием, который очищает конечную точку (базовую HTML-страницу) и возвращает определенную информацию. Содержимое страницы, которую я сканирую, отличается в зависимости от параметра в конце URL-адреса (http://some -url.com? Value = 12345 , где 12345 - мое динамическое значение).

Мне нужен этот сканер, чтобы он работал каждые x минут и сканировал несколько страниц, и для этого я установил cronjob с помощью Google Cloud Scheduler. (Я извлекаю нужные динамические значения из Firebase).

Может быть более 50 различных значений, для которых мне нужно будет сканировать определенную страницу, но я хотел бы облегчить загрузку, с которойЯ отправляю запросы, чтобы сервер не подавился. Для этого я попытался добавить задержку

1), используя setTimeout

2), используя setInterval

3), используя собственную реализацию сна:

const sleep = require('util').promisify(setTimeout);

Все 3 из этих методов работают локально ;все запросы выполняются с задержкой в ​​y секунд, как и предполагалось.

Но при попытке использования Firebase Cloud Functions и Google Cloud Scheduler

1) не все запросы отправляются

2) задержка НЕ ​​согласована (некоторые запросы запускаются справильная задержка, тогда на некоторое время не делается никаких запросов, и другие запросы отправляются с большой задержкой)

Я пробовал много вещей, но не смог решить эту проблему. Мне было интересно, может ли кто-нибудь предложить другой теоретический подход или определенную библиотеку и т. Д. Я могу принять этот сценарий, поскольку тот, который у меня сейчас есть, не работает так, как я планировал. Я добавляю один из подходов, которые локально работают ниже.

Ура!

  courseDataRefArray.forEach(async (dataRefObject: CourseDataRef, index: number) => {
    console.log(`Foreach index = ${index} -- Hello StackOverflow`);

    setTimeout(async () => {
      console.log(`Index in setTimeout = ${index} -- Hello StackOverflow`);
      await CourseUtil.initiateJobForCourse(dataRefObject.ref, dataRefObject.data);
    }, 2000 * index);

  });

(Примечание: я могу предоставить больше примеров кода, если это необходимо; но он в основном следует шаблону loop & async / await & setTimeout, и, поскольку он работает локально, я предполагаю, что это не главная проблема. )

...