60 lines
1.3 KiB
JavaScript
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);
|
|
}
|
|
|
|
|
|
|