NodeJS群集模块

我正在testingNodeJS的集群模块。 我正在尝试实现以下内容:

  • 用两个群集工作人员启动HTTP服务器。
  • 一旦主人和工人启动,主人每5秒钟向工人发送一个“检查”信息
  • 如果工人回应,则计数器被设置为0
  • 如果在下一个“检查”消息之前没有消息,则计数器递增。
  • 我检查工人是否在20秒内没有回应,然后我杀了工人,让主人开始一个新的工人。

我面临的问题是:

  • 当我杀了工人,下一个工人进入一个重新启动,杀死,重新启动,杀死等循环,这意味着在任何时间只有一个工人是积极的,另一个工人是无反应,因为它进入一个循环。

我的代码是:

var cluster = require('cluster'); var http = require('http'); var numCPUs = 2; var workerStatus = new Object(); if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal) { cluster.fork(); console.log('worker %d died (%s). restarting...', worker.process.pid, signal || code); }); // Go through all workers function eachWorker(callback) { for (var id in cluster.workers) { callback(cluster.workers[id],id); } } setInterval(function (){ eachWorker(function(worker,id) { if (workerStatus[id] == undefined) workerStatus[id]=-1; if (workerStatus[id] < 4){ workerStatus[id]++; console.log("Message Sent : " + id); worker.send('check'); }else{ delete workerStatus[id] console.log("Some Problem with " + id); worker.disconnect(); worker.kill(); } }); },5000); eachWorker(function(worker,id){ var w_id =id; worker.on('message', function(msg){ workerStatus[w_id]=0; console.log("Message Received : " + w_id); }); }); } else { process.on('message', function(msg) { process.send(msg); }); // Workers can share any TCP connection // In this case its a HTTP server http.createServer(function(req, res) { while (1) {} res.writeHead(200); res.end("hello world--" + cluster.worker.id); //cluster.worker.kill(); }).listen(8080); } 

我发现这个问题。

当我杀了工人,并开始一个新的工作人员,我不添加一个监听器为新创build的工作。 由此,新创build的工作人员永远不会收到消息。

只要添加下面的代码,问题就解决了。

 cluster.on('exit', function(worker, code, signal) { var w = cluster.fork(); console.log('worker %d died (%s). restarting...', worker.process.pid, signal || code); w.on('message', function(msg){ workerStatus[w.id]=0; console.log("Message Received : " + w.id); }); });