5

ここで簡単に説明しますが、クラスター(node.js内)で開始されたワーカーを、再起動する前にそれぞれ1時間存続させたいと思います。

注意点は、ダウンタイムをゼロにする必要があるということです。したがって、各ワーカーで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スクリプトは、エクスプレスを実装して、かなり標準的なRESTfulJSONAPIを開始します。

4

1 に答える 1

11

私が最終的にこれを行った方法は、少なくとも 2 つのワーカーが実行されていることを確認し、一度に 1 つだけ再起動することでした。

このコードは、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 分の遅延が挿入されるため、各ワーカーが再起動するための十分な時間が与えられます。つまり、すべてのワーカーがダウンすることは決してありません。

于 2012-10-17T15:41:54.143 に答える