javascript - 从 master 访问 worker 环境(Node.js 集群)

标签 javascript node.js cluster-computing env

我通过 Cluster 模块在我的 Node.js 应用程序中派生工作人员,并将自定义 ID 传递到我所有工作人员的环境。到目前为止效果很好。

但是,当发出“在线”或“退出”事件时,我不知道如何在我的主人中访问这个 ID。

文档不是很有帮助。你能告诉我正确的方法吗?

var cluster = require('cluster'); 

if (cluster.isMaster) {
  //MASTER

  function fork() {
    var worker_env = {worker_id:'my_custom_id'};
    cluster.fork(worker_env);
  }                 

  cluster.on('online', function(worker) {
    console.log(worker.process.env.worker_id); // undefined
    //
    // How can I access my custom worker id here?
    //
  });

  cluster.on('exit', function(worker, code, signal) {
    //
    // And here...?
    //
    fork();
  });

} else {
  // WORKER

  console.log(process.env.worker_id); // my_custom_id
}

最佳答案

没办法,worker进程env没有暴露给master

一个方法可以是我们集群的 map (一个包含所需信息的对象)。

像这样的东西:

var cluster = require('cluster');

if (true === cluster.isMaster) {
  //CODE EXECUTED BY MASTER
  var cluster_map = {}; // Here we store the workers info in a object   
  var restart_Limit = 10; // max global worker restart (10)

  function fork_worker(myWorkerId) {
    // these makes worker_id available in the worker
    var worker = cluster.fork({
      worker_id: myWorkerId 
    });
    // max restarts limit (global)
    if (worker.id >= restart_Limit) { 
      console.log('Restart limit reached, bye!');
      process.kill();

    }
    // here we add the key "myWorkerId"  to the cluster map
    cluster_map[worker.id] = myWorkerId;

    // WORKER AUTO-KILL
    setTimeout(function() {
      console.log('stoping...' + myWorkerId);
      worker.kill();
    }, 3000);
  }

  cluster.on('online', function(worker) {
    var online_proc = cluster_map[worker.id];

    console.log('worker online: ' + online_proc + '\n Restarts: ' + worker.id);
  });

  cluster.on('exit', function(worker, code, signal) {

    var exited_proc = cluster_map[worker.id];

    // delete the process from the cluster map
    delete cluster_map[worker.id];
    console.log("worker offline: " + exited_proc);

    // WORKER AUTO-RESTART
    setTimeout(function() {
      console.log('Restarting... ' + exited_proc);
      fork_worker(exited_proc);
    }, 3000);

  });

  // start the magic ( 3 workers )
  (function() {
    fork_worker('id_1');
    fork_worker('id_2');
    fork_worker('id_3');
  })();

} else {
  //CODE EXECUTED BY EACH WORKER (process env is present here).
  console.log('hi from the worker,  process.env: ' + process.env.worker_id);
  // all the hard work for the workers here.
}

关于javascript - 从 master 访问 worker 环境(Node.js 集群),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21879938/

相关文章:

javascript - 为什么 cometd 取消订阅不起作用?

python - Pandas 数据框 groupby 出现在两列中的文本值

javascript - 获取弹出窗体中按钮的值

javascript - 在数据自动设置为 true 的情况下,在 Fotorama 中获取当前照片的完整路径

javascript - 从 JSON 数据中获取以 Node.JS 中的前缀开头的每个键

node.js - 为什么我无法从 Expressjs/Nodejs 访问我的 javascript 文件?

maps - 从markerClusterer中删除标记

javascript - 从 Dropzone 获取上传的文件

javascript - 如何检查玩家是否面向立方体node.js

javascript - 从 Node.js Lambda 函数引用 CloudFormation 变量