Монго соединение иногда делает время ожидания лямбда-функции

Я использовал MLab MongoDB и библиотеку mongoose для создания соединения БД внутри обработчика без сервера (Lambda). Работает плавно на локальной машине. Но иногда это не работает после развертывания. Запрос возвращает Internal server error, Странная вещь иногда это работает. Но если я удалю код подключения к базе данных, обработчик сработает. Журнал без сервера просто говорит Process exited before completing request, Никаких реальных ошибок, поэтому понятия не имею, что делать.

Соединение с БД выглядит так: handler.js

// Connect to database
mongoose.connect(process.env.DATABASE_URL, {
  useMongoClient: false
}).then((ee) => {
  console.log('------------------------invoke db ', ee);
})
  .catch(err => console.error('-----------error db ', err));

Здесь тоже нет ошибок. Есть идеи, что происходит?

1 ответ

Решение

Когда вы получаете Process exited before completing requestэто означает, что node процесс потерпел крах, прежде чем лямбда смогла позвонить callback, Если вы зайдете в журналы Cloudwatch, будет ошибка и трассировка стека того, что произошло.

Вам следует подключиться к экземпляру MongoDB внутри вашего обработчика и перед вызовом callback()Сначала отключите.

Было бы так...

exports.handler = (event, context, callback) => {
  let response;

  return mongoose.connect(process.env.DATABASE_URL, {
    useMongoClient: false
  }).then((ee) => {
    // prepare your response
    response = { hello: 'world' }
  }).then(() => {
    mongoose.disconnect()
  }).then(() => {
    // Success
    callback(null, response)
  }).catch((err) => {
    console.error(err);

    callback(err);
  })
};

Вот статья, в которой подробно объясняется, как лямбда работает с узлом, и пример того, как реализовать соединение с БД. В отличие от предложенного @dashmug, вам НЕ следует отключать свою БД, так как подключение каждый раз снижает вашу производительность.

Я хотел бы вызвать сценарий, который также вызывает внутреннюю ошибку сервера.

Если вы используете шлюз API AWS в качестве триггера для функции Lambda, вы должны принять во внимание время холодного запуска. Ответ шлюза API будет ошибочным, если функция интеграции AWS Lambda не инициализирована в заданном временном диапазоне. Время ожидания интеграции шлюза API составляет от 50 миллисекунд до 29 секунд.

Я провел некоторый анализ того, как использовать пул соединений MongoDB в AWS lambda, и записал свои наблюдения в своем блоге.

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