首页 > 解决方案 > NestJS - 打开了太多的 MongoDB 连接

问题描述

我将 NestJS 用于我们的微服务,这是我们连接到 MongoDB 的方式。

import { Inject, Injectable, Scope } from '@nestjs/common';
import {
  MongooseOptionsFactory,
  MongooseModuleOptions,
} from '@nestjs/mongoose';
import { REQUEST } from '@nestjs/core';
import { Request } from '@nestjs/common';
import * as fs from 'fs';

@Injectable()
export class MongoDBService implements MongooseOptionsFactory {
  constructor(@Inject(REQUEST) private readonly request: Request) {}

  createMongooseOptions(): MongooseModuleOptions {
    if (process.env.ENVIRONMENT === 'local.dev') {
      return {
        uri: process.env.MONGO_URL,
      };
    }
    return {
      uri: process.env.MONGO_URL,
      ssl: Boolean(process.env.MONGO_SSL),
      poolSize: 10,
      maxPoolSize: 25,
      sslCA: [
        fs.readFileSync(
          __dirname + '/../../config/certificates/EnterpriseRootCA.cer',
        ),
      ],
    };
  }
}

这包含在应用程序模块中,如下所示

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: `config/${process.env.ENVIRONMENT}.env`,
    }),
    TerminusModule,
    // EventEmitterModule.forRoot({ wildcard: true, delimiter: '.' }),
    MongooseModule.forRootAsync({ useClass: MongoDBService }),
    ScorecardModule,
    // DriverlicenseModule,
    PersistenceModule,
    MigrateModule,
    PurgeModule,
  ],
  providers: [MongoDBService, RedisPersistService, MongoDBHealthIndicator],
  controllers: [HealthController],
})
export class AppModule {}

在进行一些插入和选择操作后,MongoDB 会出现“打开的连接过多”错误。当我们使用 MongooseModule 时,我需要做些什么来连接或关闭连接吗?这是来自 MongoDB 的日志

{"remote":"X.X.X.X:41412","connectionId":15945,"connectionCount":2015}}
{"t":{"$date":"2021-05-18T20:37:16.615+00:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"X.X.X.X:41412:41414","connectionId":15946,"connectionCount":2016}}
{"t":{"$date":"2021-05-18T20:37:16.616+00:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"X.X.X.X:41412:41416","connectionId":15947,"connectionCount":2017}}
{"t":{"$date":"2021-05-18T20:37:16.621+00:00"},"s":"I",  "c":"-",        "id":22948,   "ctx":"listener","msg":"pthread_create failed","attr":{"error":"Resource temporarily unavailable"}}
{"t":{"$date":"2021-05-18T20:37:16.621+00:00"},"s":"W",  "c":"EXECUTOR", "id":22993,   "ctx":"conn15947","msg":"Terminating session due to error","attr":{"error":{"code":1,"codeName":"InternalError","errmsg":"failed to create service entry worker thread"}}}
{"t":{"$date":"2021-05-18T20:37:16.621+00:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"listener","msg":"Connection ended","attr":{"remote":"X.X.X.X:41412:41416","connectionId":15947,"connectionCount":2016}}

正如您在日志中看到的,connectionCount 远远超过 2000,即使我的连接池设置为 25。任何帮助/建议将不胜感激

标签: mongodbmongoosenestjs

解决方案


推荐阅读