MongoDB Atlas与AWS Lambda之间的间歇性超时问题

时间:2019-12-16 10:36:14

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

在这个问题上我有些绝望:我们正在为API运行AWS Lambda,该API与MongoDB Atlas(M20)上的MongoDB集群通信。为了防止在每次Lambda调用时都创建新的连接,我们遵循以下模式:https://docs.atlas.mongodb.com/best-practices-connecting-to-aws-lambda/在Lambda容器的生存期内缓存连接。我们对此有一些变化:

async function getProdDB() {
  const url = `mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASSWORD}@xxxxx-yyyy.zzzzz.net?retryWrites=true`

  if (!cachedDb || !cachedDb.serverConfig.isConnected()) {
    cachedClient = await MongoClient.connect(
      url,
      { useNewUrlParser: true, useUnifiedTopology: true }
    )
    cachedDb = cachedClient.db(process.env.DB_NAME)
  }

  return cachedDb
}

还会检查我们是否连接。现在,此方法在98%的时间内都有效,但是我们的Lambda调用有时会超时。我们尝试诊断一下:

  1. 我们将Lambda的超时限制从6s更改为30s / 60秒,Lambda函数仍然会不时地超时。 Mongo从未抛出错误,由于TimeoutError总是由Lambda完成调用
  2. 在成功调用和不成功调用的情况下,cachedDB.serverConfig.isConnected()返回了rue`
  3. 导致超时的部分业务逻辑是查询MongoDB本身,这是非常小的集合(前100个文档)上常见的MongoDB操作,例如findOneupdateOne
  4. 我们尝试在https://github.com/Automattic/mongoose/issues/8180之后将NodeJS上的MongoDB驱动程序从3.3.1升级到3.3.5(尽管我们不使用Mongoose,只是官方的mongodb NodeJS驱动程序),问题仍然存在
  5. 我们尝试通过使用相同版本驱动程序的NodeJS脚本直接查询MongoDB集群,并且在数千个查询中,没有出现超时问题。因此我们得出结论,问题不在于集群本身,而在于连接。
  6. 被频繁调用的函数的超时时间不会比被定期调用的函数多,但频率较低。看来,即使在调用true时返回isConnected(),我们与MongoDB的缓存连接也会以某种方式变得过时,并且在Lambda容器保持打开状态一段时间而无需调用后就无法重用。我们正在使用默认超时时间:https://scalegrid.io/blog/understanding-mongodb-client-timeout-options/
  7. 在Atlas中检查了MongoDB日志条目-那里没有可疑的
  8. 停止对数据库连接的缓存解决了问题,但使大多数API调用的速度降低了2-3倍,我们仍然希望了解问题的根源

有人遇到过类似的问题吗?或者可以建议我们如何有效地调试此问题?

0 个答案:

没有答案