当 200 个或更多用户同时访问时,我的 NodeJS 应用程序卡在 MongoDB 的“查找”查询上。
为了演示/重现该问题,我构建了以下小型 POC,该 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,
Node :5.2.0,
MongoDB 驱动程序:2.1.7
以前有人遇到过这个问题吗? MongoDB 或 Nodes 有哪些可用工具来追踪原因?谁是这里的罪魁祸首?是 MongoDB 还是 Node 的 MongoDB native 驱动程序?
最佳答案
发布此内容是为了防止其他人遇到同样的问题。
我更新了 MongoDB 驱动程序(版本 2.1.13),问题现在似乎已经解决。然后我对我使用的版本 v 2.1.7 和 2.1.13 进行了比较,发现游标类几乎没有变化,在排气条件周围很明显。我不确定这是否是相关更改,或者是否有其他已修复的内容解决了我的问题。
关于node.js - NodeJS 服务器在同时请求的 MongoDB 查找查询上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36264331/