【问题标题】:Nodejs HTTP server handling multiple requests inserting into DBNodejs HTTP服务器处理插入数据库的多个请求
【发布时间】:2013-12-10 18:03:02
【问题描述】:

我有一个 http 服务器,每次它收到一个 post 请求时,它都应该将数据插入 MongoDB。该服务器应该在任何给定的秒内持续运行并接受数千个请求。

如何最大限度地提高代码的效率和速度?我觉得我当前的代码速度不够快,而且每次收到请求时都会创建一个新的数据库,而且会浪费 CPU 资源。

我当前的布局

var server = http.createServer(function (req, res) {

     req.on('data', function(chunk) {
          //Receive my data
     });

     req.on('end', function() {
          //JSON parse my data
          var db = new Db('test', new Server("111.111.11.111", 27017,{auto_reconnect: false}), {safe: true});  

          db.open(function(err, db) {
               //Insert data into DB
               db.close();
          });
     });
}); //End Http server
server.listen(8999);

我尝试用 MongoClient.connect 替换 db.open,但这会大大减慢处理速度,我不知道为什么。在这种情况下,用于 node js 的旧版本的 MongoDB Native 似乎工作得更快。

【问题讨论】:

  • 只需创建一次数据库连接并重复使用它。它旨在重复使用。

标签: node.js mongodb http


【解决方案1】:

您需要转向一种在启动期间打开大量连接池的方法,这些连接池由您的 HTTP 请求处理程序共享。要调整 MongoDB 连接池大小以适应您的任何可扩展性需求,请将 options 参数传递给您的 MongoClient.connect 调用。

var options = {
    server: {
        // The number of pooled connection available to your app.
        poolSize: 100
    }
};

mongodb.MongoClient.connect('mongodb://111.111.11.111/test', options, 
    function(err, db) {
        var server = http.createServer(function (req, res) {
            // Your req.on calls go here, directly using db rather than creating
            // new instances. Don't close db either.
        });
        server.listen(8999);  
    }
);

【讨论】:

  • 我可以使用的最大池大小是多少?
  • @krikara 这可能取决于您的可用内存等。 1000 在我刚刚尝试的时候在我的 VM 上工作,但是 2000 出错了。
  • 好的,让我确认一下:没有db.close。当我像这样运行程序时,它确实节省了大量 CPU(> 50% 我的原始代码),但它占用的时间是我原始方法的两倍。这里到底出了什么问题?这段代码不应该让我的服务器(接收数据、解析 json、插入数据库)更快吗?
  • @krikara No db.close,就此而言,您也没有其他现有的 db 相关代码。
  • 好吧,忘记我之前说过的一切。显然,console.log(mydata) 减慢了一切。删除后,我的服务器加速超过 100 倍:S
【解决方案2】:

不确定这是否会更好,但您可以将该服务器封装在数据库中,从而保持连接:

var db = new Db('test', new Server("111.111.11.111", 27017,{auto_reconnect: false}), {safe: true});  

db.open(function(err, db) {
    var server = http.createServer(function (req, res) {
        //now do stuff thru constant open connection
    });      
    db.close();
});

【讨论】:

  • 目前,我正在运行 jmeter 来运行 httppost.js 以向我的 server.js 发送 300 个请求。似乎像这样封装服务器会破坏来自我的 httppost.js 的连接,并且无法完成 300 个请求。
猜你喜欢
  • 2022-07-20
  • 1970-01-01
  • 2017-07-16
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2015-04-15
  • 1970-01-01
相关资源
最近更新 更多