Mongodb NestJS Mongoose连接模具负载测试
当多个开发人员使用我的API时,会向Mongoose发送多个并发请求。 当并发性很高时,连接就“死”了,并且拒绝满足任何新请求,无论我等待多长时间(几个小时!) 我只想声明,正常使用时一切正常。过度使用会导致连接崩溃 我的MongooseModule初始化:Mongodb NestJS Mongoose连接模具负载测试,mongodb,mongoose,nestjs,Mongodb,Mongoose,Nestjs,当多个开发人员使用我的API时,会向Mongoose发送多个并发请求。 当并发性很高时,连接就“死”了,并且拒绝满足任何新请求,无论我等待多长时间(几个小时!) 我只想声明,正常使用时一切正常。过度使用会导致连接崩溃 我的MongooseModule初始化: MongooseModule.forRoot(DatabasesService.MONGO_FULL_URL{ useNewUrlParser:true, useUnifiedTopology:正确, UseFindModify:false
MongooseModule.forRoot(DatabasesService.MONGO_FULL_URL{
useNewUrlParser:true,
useUnifiedTopology:正确,
UseFindModify:false,
自动加密:{
keyVaultNamespace:DatabaseService.keyVaultNamespace,
kmsProviders:DatabasesService.kmsProviders,
额外选择:{
mongocryptdSpawnArgs:['--pidfilepath','/tmp/mongocryptd.pid']
}
}一样
})
导入功能的模块:
@模块({
导入:[MongooseModule.forFeature([{name:'modelName',schema:ModelNameSchema}]),
提供者:[ModelNameService],
控制器:[……],
出口:[……]
})
服务:
@Injectable()
导出类ModelNameService{
建造师(
@InjectModel('modelName')私有modelName:Model
) {}
异步findAll():承诺{
const result:IModelName[]=等待此.modelName.find().exec();
如果(!result)抛出新的BadRequestException(`No result was found.`);
返回结果;
}
}
我尝试过使用不同的UTIL进行负载测试,最简单的是:
ab-c200-n300-H“授权:持票人$TOKEN”-m GET-b0https://example.com/getModelName
连接挂起后的任何新请求都会卡在ModelNameService.findAll()的第一行(对mongo的请求)
在详细程度为“-vvv”的mongodb日志上,我可以看到一些可疑的行:
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不会返回任何值或通知任何错误。它只是挂起,没有通知任何事情
- 终端健康检查能够ping数据库并返回健康状态
- NestJSAPI仍然有效——我能够发送新请求并接收响应。只有与错误连接相关的请求才会挂起
- 当我注入连接并检查其
时,它返回readyState
connected
- 重新启动API会立即修复它
- MongoDB本身保持正常工作
- 增加Mongoose
可以同时处理更多请求,但仍会在大量请求时崩溃poolSize
我这里的主要问题是我如何处理这个案子?目前,我添加了另一个运行状况检查,尝试每半分钟向有问题的连接发送一个查询,如果k8s确定出现故障,它将重新启动pod。这是可行的,但不是最优的。同样的问题,有什么建议吗?@GoonNguyen不幸的是,我们只是通过增加
poolSize
值和旋转更多API实例来解决这个问题。