Держите подключение MongoDB открытым в безсерверной среде - PullRequest
0 голосов
/ 14 марта 2020

Я хочу получить доступ к MongoDB изнутри AWS лямбда-функции, развернутой с помощью безсерверной инфраструктуры (serverless.com)

Существует пример структуры, как они ее открывают (https://github.com/serverless/examples/blob/master/aws-node-rest-api-mongodb/handler.js)

Но если я правильно понимаю код, они открывают и закрывают соединение для каждого запроса (соответствующий код примера):

const mongoString = ''; // MongoDB Url

const dbExecute = (db, fn) => db.then(fn).finally(() => db.close());
function dbConnectAndExecute(dbUrl, fn) {
  return dbExecute(mongoose.connect(dbUrl, { useMongoClient: true }), fn);
}

module.exports.createUser = (event, context, callback) => {
     dbConnectAndExecute(mongoString, () => (
       user
       .save()
       .then(() => callback(null, {
       statusCode: 200,
       body: JSON.stringify({ id: user.id }),
      }))
      .catch(err => callback(null, createErrorResponse(err.statusCode, err.message)))
    ));
};

Мое предположение неверно и связь остается в живых? Если нет, то как будет выглядеть правильный шаблон для поддержания открытого соединения. Я знаю, что в AWS лямбда может быть глобальное состояние, но очевидно, что безсерверная структура удаляет все после одного запуска, так как ни одно состояние, заданное мной глобально, не сохраняется.

1 Ответ

1 голос
/ 15 марта 2020

Если вы хотите, чтобы соединение оставалось после для последующих запросов к разогретой лямбда-функции, вы должны открыть соединение вне самой лямбда-функции, в той же области действия, что и const, который вы объявляете в верхней части вашего примера. Serverless Framework - это не то, что закрывает что-либо, это особенность самой Lambda.

Кроме того, вы используете функцию с именем dbConnectAndExecute, где, вероятно, было бы более полезно подключиться вне функции и затем выполнить внутри; т.е. разбить эту функцию. Таким образом, ваше соединение остается открытым, но выполнение отменяется после выполнения лямбды.

Одно слово предостережения. Не упустите слишком много открытых соединений в вашем кластере MongoDB. Это одна из причин, по которой я предпочитаю использовать такой сервис, как DynamoDB, где просто нет соединений; все выполняется через вызов API. Если у вас есть 1000 одновременно выполняющих функции Lambda, каждая из них будет иметь свое собственное соединение и позже может вызвать сбой в запросах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...