Долгое обещание приводит к тому, что приложение NodeJS не проходит проверку готовности? - PullRequest
0 голосов
/ 13 декабря 2018

В настоящее время у меня есть асинхронная функция, выполнение которой занимает ~ 7 минут.Он отлично работает на сервере локального узла, но не проходит проверку готовности в Google App Engine через ~ 6 минут и вызывает перезапуск приложения (состояние 503 при проверке готовности).

Структура функции выглядит следующим образом:

await Promise.all(customers.map(customer => recursivelyDownloadProfiles(someRequestParams)));

const recursivelyDownloadProfiles = (request, profiles = []) =>
    downloadProfilesAndReturnNextPage(request).then(
        ([nextRequest, moreProfiles]) => {
            const allProfiles = [...profiles, ...moreProfiles];
            if (!nextRequest) {
                return allProfiles;
            }
            return recursivelyDownloadProfiles(nextRequest, allProfiles);
        }
    );

Каждая загруженная страница имеет 5-секундный тайм-аут «сна», чтобы оставаться в пределах квот API.

Я пытаюсь понять проблему - это «неблокирующий» код?так что даже если моя рекурсия была бесконечной (а это не так), почему проверка готовности не удалась?

update

Просматривая журналы проверки готовности, они отправляют 200 на каждую итерацию примерно через 6 минут, а затем начинают выходить из строя на некоторой итерации.Что-то делать с http-запросами, блокирующими проверки готовности?

1 Ответ

0 голосов
/ 31 декабря 2018

Я повторно посетил эту открытую ошибку и нашел свой ответ: это была ошибка нехватки памяти в моем экземпляре.Оказывается, рекурсивная загрузка профилей достигла 1,25 ГБ ОЗУ, и экземпляр каждый раз закрывался.

После исключения запросов TIMEDOUT с ведением журнала я затем пошел в консоль движка приложения и обнаружил следующий график: Memory Profile

Конечно, это не былопроблема на моем персональном компьютере.

Это было подтверждено записью размера моего массива в байтах на моем локальном компьютере.

Решение Это было просто чрезмерное использование распространенияоператор при загрузке разбитых на страницы результатов из стороннего API.Вместо использования const cumulativeProfiles = [...cumulativeProfiles, ...newlyDownloadedProfiles] я использовал cumulativeProfiles.push(newlyDownloadedProfiles), что превышает 80 страниц, что делает огромную разницу в памяти

...