#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. Спасибо, приятель! Обязательно попробуйте