2012-10-16 70 views
4

由於我在這裏微風吹過的原因,我想讓在羣集中啓動的工作人員(在node.js中)每次生活1小時,然後重新啓動自己。Node.js +集羣::重新啓動員工沒有停機時間?

需要注意的是我需要零宕機。因此,僅僅對每個工作人員執行destroy()是不可接受的,因爲它會關閉集羣,直到重新啓動工作人員。

這裏是我的基本代碼:

if(cluster.isMaster) { 
    for(var i=0; i<2; i++) 
    { 
     cluster.fork(); 
    } 
    return; 
} 
require('./api').startup(settings, process.argv, function(error, api){ 
    if(error) 
    { 
     console.log('API failed to start: '+error); 
    } 
    else 
    { 
     console.log('API is running'); 
    } 
}); 

的api.js腳本實現快遞開始一個相當標準的RESTful API JSON。

回答

8

我最終這樣做的方式是確保我至少有2名員工在運行,然後每次只能重新啓動一名員工。

這段代碼會自動重啓誰通過cluster.worker.destroy()

cluster.on('exit', function(worker, code, signal) { 
    if (worker.suicide === true) { 
    console.log(new Date()+' Worker committed suicide'); 
    cluster.fork(); 
    } 
}); 

自殺從那裏的工人,這是使每個工人的一個簡單的事情,通過setTimeout的自殺()(或者你希望使用的其他任何條件)。我的方法其實有主殺工人:

function killWorker(worker) 
{ 
    return function() { 
     worker.destroy(); 
    }; 
} 

// This should be run on cluster.isMaster only 
function killWorkers() 
{ 
    var delay = 0; 
    for (var id in cluster.workers) { 
     var func = killWorker(cluster.workers[id]); 
     if(delay==0) 
      func(); 
     else 
      setTimeout(func, delay); 
     delay += 60000 * 5;// 5 minute delay, inserted to give time for each worker to re-spool itself 
    } 
} 

正如你所看到的,這個插入重新啓動工人之間有5分鐘的延遲,從而使每個工人足夠的時間來重新啓動本身 - 這意味着應該從來都不是所有工人都失敗的情況。

相關問題