2

当我的 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
}
4

2 回答 2

1

我们对 mysql 连接也有同样的问题,当 lambda 函数冷启动时,缓存的变量会消失。我唯一的解决方案是通过函数预热使缓存保持活跃。只需设置一个定期 cron 作业,每 5-15 分钟触发一次您的功能,请放心,它会一直处于空闲状态。你也可以检查这个:https ://www.npmjs.com/package/lambda-warmer

于 2019-08-30T11:58:49.893 回答
1

您正面临冷启动。它与数据库连接无关。

为了让您的 lambda 函数保持温暖,您可以设置 CloudWatch 事件,该事件将定期触发 Lambda(通常每 5 分钟一次就足够了)。

另外,如果您正在使用DocumentDB,则必须Lambda放入VPC. 它需要ENI配置(弹性网络接口),因此它增加了更多的启动时间。因此,例如,如果您可以避免使用 VPC,那么它可以为您带来一些性能优势。

更多信息:

于 2019-09-04T14:26:52.540 回答