Функция AWS Lambda работает правильно, несмотря на то, что выдает ошибку тайм-аута и не разрешает обратный вызов

У меня есть функция Lambda, которая получает сообщение от SNS и использует настраиваемый модуль, который запрашивает внешнюю базу данных и выводит вычисления в базу данных. Модуль работает нормально: Lambda имеет доступ в Интернет через VPC и успешно подключается к базе данных и выводит нужные данные в базу данных, но я все еще получаю сообщение об ошибке «Время ожидания задачи истекло через 3,00 секунды». Сам модуль использует sequelize, async / await и promises.

Я увеличил максимальный тайм-аут, и единственная разница заключалась в том, что количество секунд в сообщении об ошибке увеличилось до предела тайм-аута. Я попытался зарезервировать параллелизм, но ошибка не исчезла. Каждая часть моей функции отлично работает, за исключением того факта, что обратный вызов никогда не разрешается, вызывая ошибку тайм-аута. Я пробовал запускать функцию с оператором context.callbackWaitsForEmptyEventLoop и без него, запуск его с оператором только возвращает код до того, как будет завершена какая-либо функция механизма оценки. Вот код рейтинговой системы: https://github.com/elizajanus/rating-engine-module

Возможно ли, что соединение с базой данных не закрывается в моем настраиваемом модуле и не позволяет коду полностью завершить импортированную функцию? Или это могло быть что-то еще? Эта проблема может быть связана: https://github.com/sequelize/sequelize/issues/8468

const {RatingEngine} = require('./rating-engine');


exports.handler = (event, context, callback) => {
    const message = event.Records[0].Sns.Message;
    RatingEngine(message, message.d_customer_id, 
      message.d_total_distance_travelled); 
    callback(null, 'move record created in database');
};

Ваш код висит на RatingEngine, вам нужно опубликовать код из RatingEngine, иначе невозможно определить, где он висит внутри этой функции.

justcode 11.09.2018 21:32

Я только что понял, что мне не хватает заглавных букв в context.callbackWaitsForEmptyEventLoop = false. Исправив это, функция только пропустила почти весь код моего настраиваемого модуля и вернула обратный вызов до того, как какой-либо из них был завершен, поэтому сотрите эту строку. Я сделаю ссылку на цензурированную версию настраиваемого модуля на github в ближайшие десять минут или около того. Думаю, это тоже может иметь какое-то отношение к моей проблеме: github.com/sequelize/sequelize/issues/8468

Eliza Janus 11.09.2018 21:39

вот код функции RatingEngine, используемой в Lambda (заранее извиняюсь, это на этапе "заставить его работать"): github.com/elizajanus/rating-engine-module

Eliza Janus 11.09.2018 21:53

сама функция RatingEngine находится в index.js

Eliza Janus 11.09.2018 21:55

Ваш код очень обширен, не следует ли вам использовать reject () при ошибках? Я также предлагаю вам добавить aws x ray и сохранять сообщения в соответствии с шагами, достигнутыми внутри этой функции, это поможет вам определить, в чем проблема.

justcode 11.09.2018 22:07

Спасибо! Он определенно слишком обширен, чтобы не иметь надлежащей обработки ошибок, это мой первый проект в качестве стажера, и я осознал важность налаживания обработки ошибок в самом начале, после того, как все было уже написано. У меня были некоторые отклонения и обработка ошибок, когда я отлаживал локально, а затем удалил его, чтобы позже я мог выбрать лучшие методы обработки ошибок (не лучшая идея). Я продолжаю входить в систему и вижу, что все запросы выполняются успешно, но рентгеновский снимок звучит как хороший инструмент.

Eliza Janus 11.09.2018 22:25

добавлена ​​обработка ошибок и отклонений / ведение журнала, проблема по-прежнему сохраняется. добавлю aws x ray сегодня или завтра

Eliza Janus 14.09.2018 17:15
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
7
284
1

Ответы 1

@Eliza Janus, вы можете протестировать свой код локально с помощью https://www.npmjs.com/package/lambda-local, это поможет вам лучше определить проблему при отладке кода.

Другие вопросы по теме