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

Pro*_*fer 6 mongoose mongodb node.js replicaset serverless-framework

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

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

在此处输入图片说明

有人可以解释为什么会这样吗?我可以重新启动连接并将其设置为0吗?

@Stennie我用过猫鼬来连接数据库

这是我的配置文件

const mongooseOptions = {
  useNewUrlParser: true,
  autoReconnect: true,
  poolSize: 25,
  connectTimeoutMS: 30000,
  socketTimeoutMS: 30000
} 

exports.register = (server, options, next) => {
  defaults = Hoek.applyToDefaults(defaults, options)

  if (Mongoose.connection.readyState) {
    return next()
  }

  if (!Mongoose.connection.readyState) {
    server.log(`${process.env.NOED_ENV} server connecting to ${defaults.url} ${defaults.url}`)

    return Mongoose.connect(defaults.url, mongooseOptions).then(() => {
      return next() // call the next item in hapi bootstrap
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

Sag*_*uri 7

您可以尝试以下几件事:

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

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

注意: Mongoose Connection Close 会关闭连接池的所有连接。因此理想情况下,这应该在返回响应之前运行。

  1. 为什么你要显式地设置autoReconnect为true。每当连接丢失时,MongoDB 驱动程序都会在内部serverless containers重新连接,当然不建议用于生命周期较短的实例,例如.

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


Gab*_*leu 6

假设由于无服务器标签,您的后端已部署在lambda上。

每次调用都会使一个容器处于空闲状态以防止冷启动,或者使用一个已有的容器(如果有)。您将打开连接以在调用之间重用它,如最佳实践中所宣传的那样。

如果连接数poolSize为25(?),最大连接数为100,则应将函数并发限制为4。

保留并发,以防止您的功能使用该区域中所有可用的并发,或避免过载下游资源。

更多阅读:https : //www.mongodb.com/blog/post/optimizing-aws-lambda-performance-with-mongodb-atlas-and-nodejs


Kir*_*iya 5

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

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