在这个问题上我有些绝望:我们正在为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调用有时会超时。我们尝试诊断一下:
cachedDB.serverConfig.isConnected()
返回了rue` findOne
或updateOne
3.3.1
升级到3.3.5
(尽管我们不使用Mongoose,只是官方的mongodb NodeJS驱动程序),问题仍然存在true
时返回isConnected()
,我们与MongoDB的缓存连接也会以某种方式变得过时,并且在Lambda容器保持打开状态一段时间而无需调用后就无法重用。我们正在使用默认超时时间:https://scalegrid.io/blog/understanding-mongodb-client-timeout-options/ 有人遇到过类似的问题吗?或者可以建议我们如何有效地调试此问题?