2016-03-28 104 views
0

当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本地驱动程序?

+0

当他们完成时,您没有关闭打开的连接,因此您在db中引入了内存泄漏。当查找完成时(使用回调或承诺 - 它是异步的 - 使用'conn.close()' –

+0

@ sterling-archer:我印象中当你使用连接池(重新使用数据库对象)时应该只在应用程序结束时关闭连接,是不是正确或我在这里丢失了什么? – Amey

+0

@Amey这是正确的。我看不到任何与您的代码有关的问题,除非您不检查您的“err”回调,可能有一个你忽略的错误 – JohnnyHK

回答

0

发布这只是为了防止其他人遇到同样的问题。

我更新了MongoDB驱动程序(版本2.1.13),问题似乎现在已解决。然后,我在我使用的版本2.1.7和2.1.13之间选择了一个diif,并且我发现对于游标类的更改很少,在排气条件下很明显。我不确定这是一个相关的变化,还是有一些已经解决的问题解决了我的问题。