最近在一个已上线的项目中发现一个问题, 该项目的技术栈是:node+express+mongo+mongoose;
该项目每天的高峰期大概在 早8 -10 晚6- 7(晚上不是很厉害) 每天在高峰期的时候接口响应就很慢 ; 后来在代码里使用时间戳打印了一下数据库执行语句消耗时间:
//下单入口
router.post("/oderVipList", async (req, res) => {
//判断当前是否连接数据库,没有连接 · 则连接相应的数据库
let db = await dbData.getDataBaseConnection(req.hostname)
let vipCodeSM = db.model('vipCode', vipCodeSchema);
//接收前端传参
let { userIphone, vip, store, foodlist, method } = req.body
//记录 执行数据查询 前的时间戳
let startTimeC = new Date().valueOf()
//执行数据查询 , 只返回code字段
let vipIsResult = await vipCodeSM.findOne({vip:vip},{code:1})
//记录 执行数据查询 后的时间戳
let ynk = new Date().valueOf()
//查询后的时间戳 减去 查询前的时间戳 得到 执行数据查询的毫秒数
let ynkynk = ynk -startTimeC
//打印消耗时间 后面的chaTime值可不用看
console.log(vip+`查询兑换码“状态”字段消耗时间:${ynkynk},总下单消耗毫秒数${chaTime}`)
打印的结果: (因为截图的时间是晚上6点多,流量并比不了早上,早上的打印时间可高达6-8秒,并且连续一个多小时没有低于的)
这样看打印的 findOne 查询时间 使用的时间多少都有 (注意:因为我截图的时间是下午6点30左右,这时间点流量偏多,不但不是太高,早上的8-9点是特别高的,其他时间这里findOne时间都是 3- 4毫秒)
我起初从这里看认为是 这2000-3000毫秒的时候都是浪费在了数据库查询了,但是直到我 开启了 mongodb的慢查询,设置了slowms:300,并查询数据库执行超过300毫秒的,结果显示一条没有。
从这里我判断 这findOne的2000-3000豪秒时间,应该不是全消耗在数据操作上了。就考虑数据库连接池问题。
mongoose.set("useCreateIndex", true);
connections[hostq] = mongoose.createConnection(hostq, {
useNewUrlParser: true,
useUnifiedTopology: true,
poolSize: 50 //查资料是通过poolSize来配置连接池的
});
这样配置了poolSize的值,我看资料mongoose是有默认连接池是5, 我后来又给加到50 ,但还是不解决问题,又给加到150,再加到300,还是无济于事!
再通过查资料看到可检查到MongoDB的当前连接数:结果
看到 current当前连接数是39, available闲置连接:5万多。(不是很了解这个数据,具体知道什么意思)
这样看的话并没有发现我设置连接池poolSize启到了什么作用,这里不是很懂。
现在的问题是:
1.在高并发的情况下时间一个数据单数据查询时间通过我打印看到执行可到达到 2-8秒,整个下单接口中不知一次的数据库增删改查操作,导致接口执行时间可长达2分钟左右,是什么原因导致的?
2.我的连接池是否启用成功,并起到了它的作用?慢查询又是否是成功开启状态?
3.对于目前项目在高峰期时遇到的这种情况,响应过慢,影响体验,该如何解决应对?