【问题标题】:AWS Lambda - Mongoose connection timeoutAWS Lambda - Mongoose 连接超时
【发布时间】:2019-10-08 00:09:18
【问题描述】:

我正在尝试为 AWS Lambda 重用 mongodb 连接,这是我的连接函数:

const openMongodbConnection = ({ config }) => (
  process.mongoConnection ? Promise.resolve() : mongoose.connect(config.MONGO_URL, {
    bufferCommands: false,
    bufferMaxEntries: 0,
    keepAlive: true,
  })

  .then((connection) => {
    process.mongoConnection = connection;
    return Promise.resolve();
  }, err => (
    Promise.reject({
      statusCode: 500,
      errorCode: [{
        code: 'DatabaseError',
        description: `unable to connect to mongo db: ${err} ${JSON.stringify(config)}`,
      }],
    })
  ))
);

数据库位于 AWS VPC 内,没有外部访问权限。 冷启动完美运行,但有时我会收到这样的超时错误:

2018-10-03T18:36:06.984Z    7ab97df7-c739-11e8-89bf-87260b172585    MongoNetworkError: connection 2 to some.ip.from.server:27017 timed out
at Socket.<anonymous> (/var/task/node_modules/mongodb-core/lib/connection/connection.js:258:7)
at Socket.g (events.js:292:16)
at emitNone (events.js:86:13)
at Socket.emit (events.js:185:7)
at Socket._onTimeout (net.js:338:8)
at ontimeout (timers.js:386:14)
at tryOnTimeout (timers.js:250:5)
at Timer.listOnTimeout (timers.js:214:5)

我在函数的开头也有context.callbackWaitsForEmptyEventLoop = false;

这个错误是完全随机的,有时有效,有时无效,我正在考虑每次出现新请求时打开和关闭连接,但我知道这会降低 lambdas 的性能,也会增加 I来自 mongodb 服务器的 /O 操作。

我们将不胜感激。

【问题讨论】:

    标签: node.js amazon-web-services mongoose aws-lambda


    【解决方案1】:

    好吧,我自己来这里是为了寻找答案。无论如何,到目前为止,我们找到的唯一答案是每次调用 lambda 时打开和关闭数据库连接。

    显然,当 lambda 不工作时,AWS 会挂起进程,这意味着套接字在 mongodb 服务器看来是死的,所以它会丢弃连接,因为它认为它是一个死客户端。因此,试图在 lambda 调用之间保留套接字会经常导致此超时。

    【讨论】:

    • 那么您找到的解决方案是什么?和你一样,我用db.disconnect() 关闭了数据库连接,但我仍然有这个问题......
    • 打开和关闭连接似乎不起作用。我们以同样的方式进行操作,关闭所有已打开的连接。但是,这个问题仍然存在,而且过于随机和罕见。
    【解决方案2】:

    问题是当从 AWS Fargate 触发 lambda 函数时。

    当 AWS 使用 IAMRole:PassRole 时,它​​会阻止 VPC/子网配置,从而使 lambda 函数无法连接到 mongo 数据库。

    【讨论】:

      【解决方案3】:

      我们也遇到过同样的问题。事实证明,我们的问题主要在于在处理函数之外建立连接。在没有实际调用处理函数的情况下打开连接,并且只需要 lambda.js 文件。

      当我们在处理函数中移动连接代码时,问题已经消失:

      // lambda.js
      
      // DO NOT open mongodb connection here
      
      
      exports.handler = async (event, context) => {
          // open the mongo connection here
          // openMongodbConnection()
      }
      

      我不确定这会如何导致问题,但它可能与应用子网配置的顺序有关。

      【讨论】:

        猜你喜欢
        • 2017-07-25
        • 2017-10-22
        • 2018-07-23
        • 2020-11-14
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多