node.js - NodeJS 服务器在同时请求的 MongoDB 查找查询上挂起

标签 node.js mongodb connection-pooling

当 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/

相关文章:

javascript - 访问文件的序列化内容

node.js - 强制 npm install 为其他平台安装可选依赖项

javascript - 为什么 Node.js 会将 BOM 字符转换为 0xFE 0xFF?

javascript - 客户端如何根据指定类型连接到 node.js 服务器

mongodb - 适用于 Google Reader 等应用的 NoSQL 架构

java.sql.SQLException : Invalid or Stale Connection found in the Connection Cache 异常

javascript - 如何让node.js和mongoDB中的for循环同步运行

authentication - 如何验证以查看 mongodb 的 http 控制台?

java - c3p0 - 不同服务器的连接池查询

java - 使用 gwt 和 c3p0 连接池重新加载 Web 服务器?