激活我的lambda函数后,它将连接到我的MongoDB Atlas实例,从而将响应速度大大降低了1000-2000ms
我可以缓存数据库连接,但是只有在上一个请求之后迅速发出请求时,缓存才会持续,并且在一小时后发出的请求中不会持久。
任何本机AWS DB都可以避免此问题并每次都允许即时连接吗? (documentDB,DynamoDB等)
代码
let response
import { MongoClient } from 'mongodb'
let cachedDb = null
const uri =
'mongodb+srv://XXXX'
function connectToDatabase(uri) {
if (cachedDb && cachedDb.serverConfig.isConnected()) {
console.log('=> using cached database instance')
return Promise.resolve(cachedDb)
}
const dbName = 'test'
return MongoClient.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }).then(
client => {
cachedDb = client.db(dbName)
return cachedDb
}
)
}
export async function lambdaHandler() {
try {
const client = await connectToDatabase(uri)
const collection = client.collection('users')
const profile = await collection.findOne({ user: 'myuser' })
response = profile
}
} catch (err) {
console.log(err)
return err
}
return response
}
答案 0 :(得分:1)
我们在mysql连接方面存在相同的问题,当lambda函数Cold启动时,缓存的变量消失。 我唯一的解决方案是通过函数预热使缓存保持活动状态。 只需设置一个定期的cron作业即可每5到15分钟触发一次功能,请放心,它将始终处于空闲状态。 您也可以检查以下一项:https://www.npmjs.com/package/lambda-warmer
答案 1 :(得分:0)
您正面临冷启动。与数据库连接无关。
为了使lambda功能保持温暖,您可以设置CloudWatch事件,该事件将定期触发Lambda(通常每5分钟一次就足够了)。
此外,如果您使用的是DocumentDB
,则必须将Lambda
放入VPC
中。它要求提供ENI
(弹性网络接口),因此它增加了更多的启动时间。因此,例如,如果您可以避免使用VPC,那么它可以为您带来一些性能优势。
更多信息: