Files

60 lines
1.3 KiB
JavaScript

var http = require('http');
var cluster = require('cluster');
var port = 8888;
var interval =10000;
var numReqs = 0;
//worker handle http request
function requestHandler(request, response){
try {
// send response
response.writeHead(200, {'Content-Type': 'text/plain'});
var body='Hello world';
response.end(body);
// notify master about the request
process.send({ cmd: 'notifyRequest' });
} catch(error){
console.log(error)
}
}
//master count requests
function messageHandler(msg) {
if (msg.cmd && msg.cmd == 'notifyRequest') {
numReqs += 1;
}
}
//master print statistics
function flushStatistics(){
var msg = new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '') + ", " +numReqs + " requests, " + (numReqs*1000)/interval+ " TPS.";
console.log(msg);
numReqs=0;
}
if (cluster.isMaster) {
// Master start workers
var numCPUs = require('os').cpus().length;
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
console.log(numCPUs + " servers running at port " + port);
//define notification hanlder
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].on('message', messageHandler);
});
// start flush statistics timer
setInterval(flushStatistics, interval);
} else {
// Worker start server
http.createServer(requestHandler).listen(port);
}