在无服务器框架中保持MongoDB连接打开

时间:2020-03-14 15:46:02

标签: mongodb mongoose aws-lambda serverless-framework

我想从与无服务器框架(serverless.com)一起部署的AWS lambda函数中访问MongoDB

该框架有一个示例说明如何打开(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 Lambda中可以存在一个全局状态,但是显然,无服务器框架会在单次运行后删除所有内容,因为不会保留我全局设置的状态。

1 个答案:

答案 0 :(得分:1)

如果您希望在以后的请求后继续连接Lambda函数,则应在Lambda函数本身之外打开连接,该连接的范围应与示例顶部声明的const相同。无服务器框架不是关闭任何框架的方法,这是Lambda本身的功能。

此外,您正在使用名为dbConnectAndExecute的函数,在函数外部进行连接然后在其中执行可能会更有用。即分解该功能。这样,您的连接将保持打开状态,但是在Lambda执行之后,该执行将被丢弃。

一个警告。当心您的MongoDB集群上有太多打开的连接。这就是我更喜欢使用DynamoDB之类的不存在连接的服务的原因之一。一切都通过API调用执行。如果您有1000个同时执行的Lambda函数,则每个函数都有其自己的连接,以后可能会导致查询失败。