我有一个示例节点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我看到以下响应时间:
这是对的吗? N个客户端是否意味着所有客户都会回复N * 3秒?看起来有点奇怪。
我试图通过添加id参数2来改变1个客户端的有效负载大小,只返回hello。
在那种情况下,id参数化客户端立即返回,另一个继续如上所述。
是否有人能够阐明上述例子中发生的事情?
答案 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);
})
}
});