NodeJS服务器在同时发出的请求上挂起查找MongoDB的查询

时间:2016-03-28 14:24:25

标签: node.js mongodb connection-pooling

我的NodeJS应用程序在200个或更多用户同时访问时挂起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,

  • 节点:5.2.0,

  • MongoDB驱动程序:2.1.7

以前有人遇到过这个问题吗?有哪些工具可用于MongoDB或节点,以追踪原因?谁是罪魁祸首?它是MongoDB还是Node的MongoDB本机驱动程序?

1 个答案:

答案 0 :(得分:0)

发布此信息只会让其他人遇到同样的问题。

我更新了MongoDB驱动程序(版本2.1.13),问题现在似乎已得到解决。然后我在我使用的版本,2.1.7和2.1.13之间取了一个diif,我发现光标类的变化很少,在排气条件下很明显。我不确定这是否是一个相关的变化,或者还有其他一些已经修复的问题可以解决我的问题。