我刚刚进入Node并编写一个简单的HTTP负载测试器。我不确定为什么以下代码总是以线性方式报告每个Web请求时间。例如,我回过头来看,所有10个HTTP请求都比之前的要长一些。所以控制台看起来像这样:
在0.138秒内发送。
节点0在0秒,302毫秒内响应。
节点1在0秒内响应,364毫秒。
节点4在0秒,379毫秒内响应。
节点3在0秒,397毫秒内响应。
节点2在0秒内响应,410毫秒。
节点6在0秒内响应,413毫秒。
节点5在0秒内响应,429毫秒。
节点8在0秒,434毫秒内响应。
节点7在0秒,446毫秒内响应。
节点9在0秒内响应,454毫秒。
在我看来,我认为Node应该在其中一个请求得到响应时执行响应事件。任何人都可以看到我为什么会看到这样的时间?
这是代码(从Raspberry Pi运行,我的Mac也报告相同的线性时序):
var http = require('http');
var workersFinished = 0;
var workersSent = 0;
var workersErrored = 0;
var workerTimers = [];
process.stdout.write('\u001B[2J\u001B[0;0f');
try
{
http.globalAgent.maxSockets = 5000;
var options = {
host: '192.168.1.88',
port: 90,
path: '/xampp'
};
var callback = function(response) {
var buffer = '';
response.setEncoding('utf8');
response.on('data', function(chunk) {
buffer += chunk;
});
response.on('end', function() {
//console.log('Headers: ' + JSON.stringify(resp.headers));
//console.log('Received bytes: ' + buffer.length);
//console.log('Status Code: ' + response.statusCode);
//http.request(options, callback).end();
});
};
function doRequest(id, options, callback) {
var request = http.request(options, callback);
request.on('response', function(r) {
var elapsed = process.hrtime(workerTimers[id]);
console.log('Node ' + id + ' responded in ' + elapsed[0] + ' s, ' + (elapsed[1] / 1000000).toFixed(0) + ' ms.');
//doRequest(id, options, callback); // Send this worker off again.
workersFinished++;
});
request.on('error', function(error) {
workersErrored++;
});
request.end();
workerTimers[id] = process.hrtime();
}
var start = process.hrtime();
for (var i = 0; i < 10; i++) {
doRequest(i, options, callback);
workersSent++;
}
var diff = process.hrtime(start);
var elapsedMs = diff[1] / 1000000;
var elapsedSeconds = diff[0];
console.log("Sent in " + elapsedSeconds + "." + elapsedMs.toFixed(0) + " seconds.");
}
catch (err) {
console.log(err.message);
}