У меня есть функция 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');
};
Я только что понял, что мне не хватает заглавных букв в context.callbackWaitsForEmptyEventLoop = false. Исправив это, функция только пропустила почти весь код моего настраиваемого модуля и вернула обратный вызов до того, как какой-либо из них был завершен, поэтому сотрите эту строку. Я сделаю ссылку на цензурированную версию настраиваемого модуля на github в ближайшие десять минут или около того. Думаю, это тоже может иметь какое-то отношение к моей проблеме: github.com/sequelize/sequelize/issues/8468
вот код функции RatingEngine, используемой в Lambda (заранее извиняюсь, это на этапе "заставить его работать"): github.com/elizajanus/rating-engine-module
сама функция RatingEngine находится в index.js
Ваш код очень обширен, не следует ли вам использовать reject () при ошибках? Я также предлагаю вам добавить aws x ray и сохранять сообщения в соответствии с шагами, достигнутыми внутри этой функции, это поможет вам определить, в чем проблема.
Спасибо! Он определенно слишком обширен, чтобы не иметь надлежащей обработки ошибок, это мой первый проект в качестве стажера, и я осознал важность налаживания обработки ошибок в самом начале, после того, как все было уже написано. У меня были некоторые отклонения и обработка ошибок, когда я отлаживал локально, а затем удалил его, чтобы позже я мог выбрать лучшие методы обработки ошибок (не лучшая идея). Я продолжаю входить в систему и вижу, что все запросы выполняются успешно, но рентгеновский снимок звучит как хороший инструмент.
добавлена обработка ошибок и отклонений / ведение журнала, проблема по-прежнему сохраняется. добавлю aws x ray сегодня или завтра
@Eliza Janus, вы можете протестировать свой код локально с помощью https://www.npmjs.com/package/lambda-local, это поможет вам лучше определить проблему при отладке кода.
Ваш код висит на RatingEngine, вам нужно опубликовать код из RatingEngine, иначе невозможно определить, где он висит внутри этой функции.