AWS Lambda - Mongoose连接超时

4

我正在尝试在AWS Lambdas中重复使用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;

这个错误是完全随机的,有时候可以工作,有时候不行。我正在考虑每次出现新请求时打开和关闭连接,但我知道这会降低Lambda的性能,并增加对mongodb服务器的I/O操作。

非常感谢您的帮助。

3个回答

1

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

显然,当lambda不工作时,AWS挂起进程,这意味着套接字对mongodb服务器来说看起来已经死亡,因此它会断开连接,因为它认为这是一个死掉的客户端。因此,试图在lambda调用之间保持套接字会导致这种超时情况经常发生。


那么你找到了什么解决方案?像你一样,我使用 db.disconnect() 关闭了数据库连接,但我仍然遇到了这个问题... - Gura
打开和关闭连接似乎不起作用。我们以相同的方式进行操作,关闭已经打开的每个连接。但是,这个问题仍然存在,而且非常随机和罕见。 - Avani Khabiya

0
问题出在当 AWS Fargate 触发 Lambda 函数时。
当 AWS 使用 IAMRole:PassRole 时,它会破坏 VPC/Subnet 配置,从而导致 Lambda 函数无法连接到 MongoDB 数据库。

-1
我们曾经遇到过同样的问题。事实证明,我们的问题主要是在处理程序函数之外建立连接。连接是在没有实际调用处理程序函数的情况下打开的,只通过需要lambda.js文件来完成。
当我们将连接代码移动到处理程序函数内部时,问题就消失了:
// lambda.js

// DO NOT open mongodb connection here


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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接