我正在使用mongodb和nodejs。我已经在Atlas上托管了mongodb。
我的后端一直运行良好,但是现在有时会卡住,当我在mongodb地图集上看到分析数据时,它显示活动连接的最大数量达到了 100 。
有人可以解释为什么会这样吗?我可以重启连接并使其 0 吗?
答案 0 :(得分:6)
假设您的后端从无服务器标记开始就部署在了lambda上。
每次调用都会使容器处于空闲状态,以防止冷启动,或者使用现有容器(如果有)。您将打开连接,以便在调用之间重用它,就像在best practices中宣传的那样。
poolSize
的连接数为25(?),最大连接数为100,因此您应将function concurrency限制为4。
保留并发性以防止您的功能使用该区域中所有可用的并发性或使下游资源超载。
更多阅读内容:https://www.mongodb.com/blog/post/optimizing-aws-lambda-performance-with-mongodb-atlas-and-nodejs
答案 1 :(得分:3)
您可以尝试以下几种方法:
在serverless
环境中,如@Gabriel Bleu所建议的那样,为什么会有如此高的connectionLimit
。 Serverless
环境不断产生新的容器并根据请求停止。如果同时产生多个实例,将很快耗尽MongoDB服务器的限制。
connectionPool
的概念是,每次从每个节点(实例)建立x
个连接。但这并不意味着所有连接在查询后都会自动释放。完成 ALL 数据库操作后,您应该release
在使用后每个连接:mongoose.connection.close();
注意:猫鼬连接关闭将关闭连接池的所有连接。因此,理想情况下,应在返回响应之前运行它。
为什么要将显式autoReconnect
设置为true。 MongoDB driver internally会在连接断开时重新连接,对于serverless containers
这样的短寿命实例,当然不建议这样做。
如果您以cluster
模式运行,为了优化性能,请将serverUri
更改为副本集URL格式:MONGODB_URI=mongodb://<username>:<password>@<hostOne>,<hostTwo>,<hostThree>...&ssl=true&authSource=admin
。
答案 2 :(得分:1)
有太多因素影响max connection limit
。您已经将mongoDB
托管在Atlas上,并且正如您所提到的,后端为lamda
意味着您拥有无服务器环境。
peak
连接表明正在初始化的实例太多,或者来自用户连接的并发请求太多。最佳做法是在不再需要时终止数据库连接。您可以终止连接
mongoose.connection.close();
就像您使用mongoose
一样。它将从连接池释放连接。与其用尽并发连接限制,不如在空闲时释放连接。autoReconnect
显式设置为true
,因此一旦断开连接,驱动程序将快速实例化连接请求。这可能会影响concurrent connection limit
。您应该避免明确设置它。cluster mode
可以根据负载优化请求,您可以将服务器uri更改为数据库副本。可能有助于迁移负载。mongos
的连接比与副本集的连接要快。在Lambda函数的生命周期内,后续连接将明显更快。因此,每次调用都将使容器处于空闲状态以防止cold start
或cold boot
,或使用现有的容器(如果有)。 restart
应用程序。为了将来避免出现此问题,请考虑利用maxPoolSize连接字符串选项来限制连接池中的连接数。