由于数据库连接,初始请求在Lamda上变慢

时间:2019-08-28 14:06:10

标签: mongodb aws-lambda amazon-dynamodb aws-documentdb

激活我的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
}

2 个答案:

答案 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,那么它可以为您带来一些性能优势。

更多信息: