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