服务器上的活动连接数已达到最大

时间:2019-05-30 07:19:45

标签: node.js mongodb replicaset mongo-shell mongodb-atlas

我正在使用mongodb和nodejs。我已经在Atlas上托管了mongodb。

我的后端一直运行良好,但是现在有时会卡住,当我在mongodb地图集上看到分析数据时,它显示活动连接的最大数量达到了 100

enter image description here

有人可以解释为什么会这样吗?我可以重启连接并使其 0 吗?

3 个答案:

答案 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)

您可以尝试以下几种方法:

  1. serverless环境中,如@Gabriel Bleu所建议的那样,为什么会有如此高的connectionLimitServerless环境不断产生新的容器并根据请求停止。如果同时产生多个实例,将很快耗尽MongoDB服务器的限制。

  2. connectionPool的概念是,每次从每个节点(实例)建立x个连接。但这并不意味着所有连接在查询后都会自动释放。完成 ALL 数据库操作后,您应该release在使用后每个连接:mongoose.connection.close();

注意:猫鼬连接关闭将关闭连接池的所有连接。因此,理想情况下,应在返回响应之前运行它。

  1. 为什么要将显式autoReconnect设置为true。 MongoDB driver internally会在连接断开时重新连接,对于serverless containers这样的短寿命实例,当然不建议这样做。

  2. 如果您以cluster模式运行,为了优化性能,请将serverUri更改为副本集URL格式:MONGODB_URI=mongodb://<username>:<password>@<hostOne>,<hostTwo>,<hostThree>...&ssl=true&authSource=admin

答案 2 :(得分:1)

有太多因素影响max connection limit。您已经将mongoDB托管在Atlas上,并且正如您所提到的,后端为lamda意味着您拥有无服务器环境。

  1. 无服务器环境会在新连接上生成新容器,并在不再使用该连接时破坏该连接。 peak连接表明正在初始化的实例太多,或者来自用户连接的并发请求太多。最佳做法是在不再需要时终止数据库连接。您可以终止连接 mongoose.connection.close();就像您使用mongoose一样。它将从连接池释放连接。与其用尽并发连接限制,不如在空闲时释放连接。
  2. 您的配置迫使数据库驱动程序在数据库断开连接后重新连接。您将autoReconnect显式设置为true,因此一旦断开连接,驱动程序将快速实例化连接请求。这可能会影响concurrent connection limit。您应该避免明确设置它。
  3. cluster mode可以根据负载优化请求,您可以将服务器uri更改为数据库副本。可能有助于迁移负载。
  4. 首次调用Lambda函数,并且您的AWS Lambda函数中的MongoDB客户端连接到MongoDB时,会有很小的初始启动成本,大约为5至10秒。分片群集与mongos的连接比与副本集的连接要快。在Lambda函数的生命周期内,后续连接将明显更快。因此,每次调用都将使容器处于空闲状态以防止cold startcold boot,或使用现有的容器(如果有)。
  5. Atlas根据群集层设置对群集的并发传入连接的限制。如果您在达到此限制时尝试连接,则MongoDB将显示一条错误消息,指出“由于打开的连接过多,连接被拒绝”。您可以关闭与群集当前未使用的任何打开的连接。缩小到更高的层以支持更多并发连接。如最佳实践中所述,您可以restart应用程序。为了将来避免出现此问题,请考虑利用maxPoolSize连接字符串选项来限制连接池中的连接数。
  6. 该问题的最终解决方案是升级到更大的Atlas群集层,从而允许更多数量的连接。如果您的用户群对于您当前的集群层而言太大。