当200个或更多用户同时访问时,我的NodeJS应用程序挂在MongoDB的“查找”查询上。NodeJS服务器挂起查找同时请求的MongoDB查询
为了演示/重现我已经构建的以下小POC,它具有一条路由并连接到MongoDB并获取数据。当我使用LoadUIweb创建约500个同时请求时,有时,收集的“findone”函数永远不会返回。
var express = require('express');
var mongodb = require('mongodb');
var config = require('../Config/Config');
var logger = require('../Config/LogManager');
var app = express();
var MONGODB_URI = config.PCMMongoDB;
var db;
var coll;
// Initialize connection once
mongodb.MongoClient.connect(MONGODB_URI, function(err, database) {
if(err) throw err;
db = database;
coll = db.collection('FacilitySettings');
app.listen(3000);
console.log('Listening on port 3000');
});
// Reuse database/collection object
app.get('/', function(req, res) {
logger.loggerinfo.info("Got the request");
//var result = new Array();
coll.find({}, function(err, docs) {
logger.loggerinfo.info("Got the Response", err);
docs.each(function(err, doc) {
if(err){
logger.loggerinfo.info("Got the error while iterating", err);
res.end();
}
if(doc) {
logger.loggerinfo.info("Iterated the Response");
res.write(JSON.stringify(doc) + "\n");
//result.push(doc);
}
else {
logger.loggerinfo.info("Returned the Response");
res.end();
}
});
});
});
“FacilitySettings”集合有大约100个文档。
当服务器挂起时,它会打印“获取请求”和“得到响应”,但它从不打印“迭代响应”和“返回响应”。看起来Nodes服务器本身并没有被挂起,因为它接受了新的请求。看来MongoDB的结果永远不会返回。 当我检查MongoDB上最后执行的查询时,似乎查询永远不会到达MongoDB。 我使用以下版本:
的MongoDB:3.2.3,
节点:5.2.0,
MongoDB的驱动程序:2.1.7
有任何人遇到过这个问题?有什么工具可用于MongoDB或Nodes来追踪原因?谁是这里的罪魁祸首?它是MongoDB还是Node的MongoDB本地驱动程序?
当他们完成时,您没有关闭打开的连接,因此您在db中引入了内存泄漏。当查找完成时(使用回调或承诺 - 它是异步的 - 使用'conn.close()' –
@ sterling-archer:我印象中当你使用连接池(重新使用数据库对象)时应该只在应用程序结束时关闭连接,是不是正确或我在这里丢失了什么? – Amey
@Amey这是正确的。我看不到任何与您的代码有关的问题,除非您不检查您的“err”回调,可能有一个你忽略的错误 – JohnnyHK