【发布时间】:2020-02-27 20:27:48
【问题描述】:
大家好,我需要一个简单问题的答案。我正在将 Aws lambda 与无服务器框架一起使用,并且我在 aws lambda 中使用 mongoDb 连接。我在处理程序函数中使用了连接代码,并且我使用了连接池。
现在,当我使用 sls deploy 在 AWS 上部署我的应用程序时,在我第一次调用我的 lambda 时部署后,连接只建立一次,之后在其他 lambda API 调用上它正在重用我的连接而不是创建新连接。所以这件事很好。
现在,在此过程之后,我正在运行一个与我的 AWS 应用程序无关的脚本来测试我的并发 lambda 请求。我在脚本中的 for 循环中使用 request npm 模块调用了我的相同 lambda API,在这种情况下,我一直在循环终止之前创建新的连接,而不是使用第一次调用生成的现有连接。有人可以告诉我为什么会发生这种情况以及这背后的原因是什么?为什么我已经在第一次 lambda 调用时创建了连接,但当此脚本运行时我的连接再次创建。
当我从邮递员调用相同的 api 时,它会在第一次 lambda 调用后恢复我的连接,但是当我运行此脚本并从内部脚本中,我使用命令“node app.js”调用此 API(使用请求 NPM 模块)然后一直到循环终止它都会创建新的连接。
请帮帮我。
'use strict'
const bodyParser = require('body-parser')
const express = require('express')
const serverless = require('serverless-http')
const cors = require('cors');
const mongoConnection = require('./connection/mongoDb');
const app = express()
app.use(cors())
app.use(bodyParser.json())
const handler = serverless(app);
let cachedDb = null;
module.exports.handler = async (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
if (cachedDb == null) {
let Database = await mongoConnection();
console.log("DB", Database);
cachedDb = Database
}
const baseRouter = require('./routes/index');
app.use('/api', baseRouter);
const result = await handler(event, context);
return result;
};
【问题讨论】:
-
你会分享你的任何代码 sn-ps 吗?
-
我已经使用来自官方网站的 mongodb 连接的 aws lambda 的普通代码,代码没有问题。这个概念是如何工作的,我不明白。
-
如果没有您部署到 lambda 的实际代码,这真的很难说,如果您发布处理程序代码,我可以看看。但如果我不得不猜测,它与您如何确定连接变量和容器重用的范围有关(请参阅aws.amazon.com/blogs/compute/container-reuse-in-lambda)。
-
我已添加代码请查看此@LucHendriks
标签: node.js mongodb aws-lambda api-gateway