Я реализовал веб-скребок с 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, и, поскольку он работает локально, я предполагаю, что это не главная проблема. )