我希望使用连接到MongoDB数据库的AWS Lambda/API网关创建一个RESTful API.我已经读到,到MongoDB的连接相对昂贵,所以最好的做法是在建立连接后保留一个连接以供重用,而不是 for each 新查询建立新的连接.

这对于普通应用程序来说非常简单,因为您可以在启动期间建立连接,并在应用程序生命周期内重用它.但是,由于Lambda被设计成无状态的,因此保留这种连接似乎不那么直截了当.

因此,我想知道解决这个数据库连接问题的最佳方法是什么?每次调用Lambda函数时,我是否都必须建立新的连接,或者是否有办法将这些连接汇集/缓存起来,以实现更高效的查询?

谢谢

推荐答案

AWS Lambda函数应该定义为无状态函数,因此它们不能像连接池那样保持状态.

这个问题也在这AWS forum post篇文章中提出.2015年10月5日,AWS工程师肖恩(Sean)发布消息称,通过在处理程序块之外的代码初始化上创建一个池,您应该在每个请求上打开和关闭连接.但两天后,同一位工程师发布了you should not do this.

问题是,您无法控制Lambda的运行时环境.我们知道这些环境(或容器)是可重用的,正如blog post by Tim Wagner所描述的.但缺乏控制可能会让你耗尽所有资源,比如达到数据库中的连接限制.但这取决于你.

您可以使用RESTHeart通过HTTP访问数据库,而不是通过lambda函数连接到MongoDB.MongoDB的连接池由RESTHeart维护.请记住,在性能方面,您将在每个请求上打开一个到RESTHeart的新HTTP连接,而不是像在传统应用程序中那样使用HTTP连接池.

Node.js相关问答推荐

Google Drive API返回200(HTTP成功)用于测试pdf输出,但没有文件

使用Vite和ReactJS时,在哪里设置NODE_OPTIONS?

为什么我收到此错误:MissingSchemaError:架构尚未为模型&业务&注册

如何获取mongoose中单个id数据的记录

为什么我的 Node.js 应用程序在登录时无法正确验证密码(使用 Passport-local 和 bcryptjs)?

是否可以在 NodeJS 代码库中的每个函数之前和之后添加 console.log?

有没有办法判断 UUID 是否是使用 node.js 中的特定命名空间生成的?

eSignature API 的 NodeJS SDK 是否支持数据流?

如何使用 Remix 仅在客户端呈现组件?

BrowserRouter 无法渲染组件

try 在 NodeJS 项目中实现 SimplePay (OTP) 支付网关,但我无法获得与技术文档中相同的签名

在 nodejs 中使用 multer 上传文件返回未定义的 req.file 和空的 req.body

FirebaseCloudMessaging : PlatformException (PlatformException(null-error, Host platform returned null value for non-null return value., null, null))

Mongoose,如何一次更新多个?

提供静态文件到底是什么意思?

我可以向NPM添加调试脚本吗?

如何使用 Puppeteer 从输入中删除现有文本?

对不同对象中的函数使用相同的键时,V8 中的函数调用缓慢

将 NodeJS 用于大型项目

在 Node.js 中写入 CSV