【问题标题】:NodeJS Cluster ModuleNodeJS 集群模块
【发布时间】:2014-06-01 00:44:31
【问题描述】:

我正在测试 NodeJS 的集群模块。我正在努力实现以下目标:

  • 使用两个集群工作者启动 HTTP 服务器。
  • 一旦 master 和 worker 启动,master 就会发送一个“检查” 每 5 秒向工作人员发送一次消息
  • 如果工作人员回复,则计数器设置为 0
  • 如果在下一条“检查”消息之前没有消息,则 计数器递增。
  • 然后我检查工人是否在随后的 20 秒内没有响应 我杀了worker,让master启动一个新的worker。

我面临的问题是:

  • 当我杀死工作人员时,下一个工作人员进入重新启动、杀死、重新启动、杀死等循环,这意味着在任何时间点只有一个工作人员处于活动状态,而另一个工作人员没有响应,因此它进入了循环。

我的代码是:

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);
}

【问题讨论】:

    标签: node.js worker


    【解决方案1】:

    我发现了问题。

    当我杀死工作人员并启动新工作人员时,我不会为新创建的工作添加侦听器。因此,新创建的工作人员永远不会收到消息。

    只需添加以下代码,问题就解决了。

    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);
        });
    
    });
    

    【讨论】:

      【解决方案2】:

      我有一个简单的支持模块,可以分离工作脚本(并简单地加载不同的脚本 + 处理通信),这可能会有所帮助:runworker

      【讨论】:

        猜你喜欢
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 2014-02-25
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 2019-05-15
        相关资源
        最近更新 更多