2014-02-19 91 views
2

我通過集羣模塊在我的Node.js應用程序中分配工作人員,並將自定義ID傳遞給我所有工作人員的環境。這很有效。來自主服務器的訪問員工環境(Node.js集羣)

但是,我不知道如何在發佈'在線'或'退出'事件時在主人中訪問此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 
} 

回答

2

theres no way,工作進程env沒有暴露給master。

一個aproach可以是我們的羣集的地圖(一個對象包含所需的信息)。

的類似:

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. 
} 
+1

謝謝你,也爲例子。將這樣做。 – 1nsane