Соединение NestJS Mongoose умирает при нагрузочном тестировании

#mongodb #mongoose #nestjs

#mongodb #mongoose #nestjs

Вопрос:

Когда несколько разработчиков используют мой API, в Mongoose отправляется несколько одновременных запросов. Когда параллелизм высок, соединение просто «умирает» и отказывается выполнять любой новый запрос, независимо от того, как долго я жду (часы!).).

Я просто хочу заявить, что при обычном использовании все работает нормально. Интенсивное использование приводит к сбою соединения.

Инициализация моего mongoos-модуля:

 MongooseModule.forRoot(DatabasesService.MONGO_FULL_URL, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
  autoEncryption: {
    keyVaultNamespace: DatabasesService.keyVaultNamespace,
    kmsProviders: DatabasesService.kmsProviders,
    extraOptions: {
      mongocryptdSpawnArgs: ['--pidfilepath', '/tmp/mongocryptd.pid']
    }
  } as any
})
  

Модуль, который импортирует функцию:

 @Module({
  imports: [MongooseModule.forFeature([{ name: 'modelName', schema: ModelNameSchema }])],
  providers: [ModelNameService],
  controllers: [...],
  exports: [...]
})
  

Обслуживание:

 @Injectable()
export class ModelNameService {
  constructor(
    @InjectModel('modelName') private modelName: Model<IModelName>
  ) {}

  async findAll(): Promise<IModelName[]> {
    const result: IModelName[] = await this.modelName.find().exec();
    if (!result) throw new BadRequestException(`No result was found.`);
    return resu<
  }
}
  

Я пробовал loadtesting с использованием разных утилит, самый простой был:

 ab -c 200 -n 300 -H "Authorization: Bearer $TOKEN" -m GET -b 0 https://example.com/getModelName
  

Любой новый запрос после зависания соединения застревает в первой строке ModelNameService.findAll() (запрос к mongo).

В журналах mongodb с подробным описанием «-vvvvv» я вижу несколько подозрительных строк:

 User Assertion: Unauthorized: command endSessions requires authentication src/mongo/db/commands.cpp

Cancelling outstanding I/O operations on connection to 127.0.0.1:33134
  

И я также обнаружил, что оно не превышает 12 открытых соединений одновременно. Он всегда ожидает закрытия, прежде чем открывать новое.

Другие ключевые моменты:

  • Mongoose не возвращает никакого значения и не уведомляет о какой-либо ошибке. Он просто зависает, ничего не уведомляя.
  • Проверка работоспособности терминала позволяет выполнить пинг БД и возвращает состояние работоспособности.
  • API NestJS все еще работает — я могу отправлять новые запросы и получать ответ. Зависают только запросы, связанные с неисправным подключением.
  • Когда я вводю соединение и проверяю его readyState , оно возвращается connected .
  • Перезапуск API немедленно исправляет это.
  • Сам MongoDB продолжает работать в обычном режиме.
  • Увеличивающийся Mongoose poolSize способен обрабатывать больше запросов одновременно, но все равно будет сбой при большем количестве запросов.

Мой главный вопрос здесь в том, как мне справиться с этим случаем? В настоящее время я добавил еще одну проверку работоспособности, чтобы попытаться отправить запрос проблемному соединению каждые полминуты, и k8s перезапускает модуль, если он определяет сбой. Это работает, но не оптимально.

Комментарии:

1. Тот же вопрос, есть предложения?

2. @GoonNguyen к сожалению, мы решили эту проблему только за счет увеличения poolSize стоимости и увеличения количества экземпляров API.

3. Спасибо, приятель! Обязательно попробуйте