Node.js和mongoDB为并发请求服务

我在使用mongoDB服务来自简单node.js服务器的并发请求时遇到了问题。

我在做的是用mongo shell格式发送查询,parsing它们并从mongoDB发回数据。

但似乎不能在同一时间出于某种原因服务多个请求。(顺便说一句,我在本地使用它)

编辑:我有时在我的客户端应用程序中得到这个错误:

"Stream Error. URL: http://localhostlink:1337"

我也得到当服务器没有运行…

编辑2:我删除了db.close语句。

群集真的是正确的解决scheme,因为我将只是升级应用程序服务4个并发请求,这仍然是不够的。

我应该以其他方式彻底重构服务器吗? 我只是想能够从mongoDB提供多个数据请求。

EDIT3:

可以,我先创build服务器,然后连接到mongo,或者我应该创buildMongoClient.connect(…)函数内的服务器?

这是我的(未优化的)服务器的代码:

  var http = require('http'); var qs = require('querystring'); var mongo =require('mongodb'); var MongoClient = mongo.MongoClient; var result; var response; var ObjectId = require('mongodb').ObjectID; var myDb; http.createServer(function (request, res) { console.log("creating server..."); MongoClient.connect("mongodb://127.0.0.1:27017/lalal", function(err, db) { if(err) { return console.dir(err); } if (request.method == 'POST') { var body = ''; response = res; request.on('data', function (data) { body += data; // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB if (body.length > 1e6) { // FLOOD ATTACK OR FAULTY CLIENT, NUKE REQUEST request.connection.destroy(); } }); request.on('end', function () { var clientData = qs.parse(body); var parts = clientData.data.split("."); var collectionName = parts.shift(); var queryBig = parts.join("."); var queryParts = queryBig.split("("); var method = queryParts[0]; var query = queryParts.join("("); console.log("query:"+query); console.log("method:"+method); console.log("collection:"+collectionName); var callback; switch(method){ case 'find': callback = '.toArray(findCallback);'; break; case 'insert': query = query.substring(0, query.length - 1); callback = ',insertCallback);'; break; case 'remove': query = query.substring(0, query.length - 1); callback = ',removeCallback);' break; case 'save': query = query.substring(0, query.length - 1); callback = ',saveCallback);' break; case 'update': query = query.substring(0, query.length - 1); callback = ',updateCallback);' break; } if(query.indexOf('"_id"') != -1) { var indexHelper = query.indexOf('"_id"')+7; var s = query.substring(indexHelper, query.length); var indexOfQuote = s.indexOf('"') var restOfQuery = s.substring(indexOfQuote+1,s.length); var key = s.substring(0,indexOfQuote); query = query.substring(0,indexHelper-1) + 'new ObjectId("'+key +'")'+restOfQuery; } // Connect to the db // myDb = db; var collection = db.collection(collectionName); var command = 'collection.'+query+callback; console.log("command:"+command); eval(command); function findCallback(err, items){ console.log(items); response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(JSON.stringify(items)); } function insertCallback(err, objects) { console.log(objects); if (err) console.warn(err.message); if (err && err.message.indexOf('E11000 ') !== -1) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('"error":"_id already exists"'); } else{ response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(JSON.stringify(objects)); } } function removeCallback(err, numberOfRemovedDocs) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(JSON.stringify(numberOfRemovedDocs)); } function saveCallback(err, result) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(JSON.stringify(result)); } function updateCallback(err, numberOfUpdatedDocs) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(JSON.stringify(numberOfUpdatedDocs)); } }); } }); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/'); 

你看到的问题是因为node.js是单线程的。 也就是说,它将一次发送一个请求(这实际上是好的,因为它有助于避免由全局variables处理引起的错误)。 如果您在执行查询之前发送了响应,您将看到并行查询执行。 但是,考虑到您构build程序的方式,您最好使用“集群”模块。 下面的代码将启动四个并发进程。

 var cluster = require('cluster'); if (cluster.isMaster) { for (var i = 0; i < 4; i++) { cluster.fork(); } cluster.on('exit', function (worker, code, signal) { cluster.fork(); }); } else { // run your node.js + MongoDB code here } 

PS。 在使用MongoClient.connect时,您不需要closures数据库连接,因为此API使用连接池来pipe理连接。