NodeJS多线程和大数据集

时间:2016-02-01 16:04:45

标签: node.js multithreading express

我有一个示例节点JS express rest application:

var express = require('express');
var logger = require('./src/logger');


var columnValue = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
var columnKey = "column";

var app = express();

var targetRecord = {};
logger.info("Creating Record...");
for (var i = 1; i <= parseInt("500"); i++) {
  targetRecord[columnKey+i]=columnValue;
}
logger.info("Creating Record complete.");

logger.info("Creating payload...");
var targetPayload = {};
var test = 500
for (var i = 1; i <= test; i++) {
  targetPayload["flight"+i]=targetRecord;
}
logger.info("Creating payload complete.");


/* GET home page. */
app.get('/flight', function (req, res) {
  logger.info("start"+req.query.id);
  if(req.query.id==2)
  {
      res.send("hello");
  }
  else {
  res.send(JSON.stringify(targetPayload));
  res.end();
  }

  logger.info("end"+req.query.id);
});

app.listen(8000, function () {
  logger.info('server listening on port ' + this.address().port);
});

要返回的总数据大小为28MB。

使用curl我看到以下响应时间:

  • 1客户3秒
  • 2个客户都需要6秒
  • 4个客户都需要11秒

这是对的吗? N个客户端是否意味着所有客户都会回复N * 3秒?看起来有点奇怪。

我试图通过添加id参数2来改变1个客户端的有效负载大小,只返回hello。

在那种情况下,id参数化客户端立即返回,另一个继续如上所述。

是否有人能够阐明上述例子中发生的事情?

1 个答案:

答案 0 :(得分:0)

这是节点土地中的已知问题。您的JSON.stringify()电话是一项昂贵的同步CPU操作,Express正在按顺序处理您的所有请求。因此,在解除循环之前,Express不响应每个客户端。尝试将stringify调用放在setImmediate内以取消阻止循环:

app.get('/flight', function (req, res) {
  logger.info("start"+req.query.id);
  if(req.query.id==2)
  {
      res.send("hello");
  }
  else {
    setImmediate(function(){
       res.send(JSON.stringify(targetPayload));
       res.end();
       logger.info("end"+req.query.id);
    })

  }


});