2016-03-28 105 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,並且我發現對於遊標類的更改很少,在排氣條件下很明顯。我不確定這是一個相關的變化,還是有一些已經解決的問題解決了我的問題。