2016-10-11 8 views
0

私は労働者を作成しようとし、それは正常に動作します。それには4つのコアがあり、複数の試行で1人のワーカーからのメッセージしか表示されません。ノードjsクラスター - それはどのように動作する

var app = express(); 
app.use(express.static('public')); 
app.use(bodyParser.urlencoded({ extended: false })); 


if (cluster.isMaster) { 
    var cpuCount = os.cpus().length ; 
    console.log("No. of cpus:", cpuCount); 
    for(var i = 0; i < cpuCount; i++) cluster.fork(); 

    cluster.on('listening', function(worker, address) { 
     console.log('woker id:' + worker.id +' is now listening on port:' + address.port); 
    }); 
} else { 
    console.log("i'm a worker.. ... lets proceed"); 
    var server = app.listen(8082, function(req, res) { 

     var host = server.address().address; 
     var port = server.address().port; 
     request(i18n.__('url.config'), function(error, response, body){ 
      if (!error && response.statusCode == 200) { 
      } else { 
       console.log("Config error",error); 
      } 
     }); 
    }); // child process 

}// else 

//Listen for dying workers 
cluster.on('exit', function (worker) { 
    // Bring that ... ..er back 
    console.log('Worker %d died :', worker.id); 
    cluster.fork(); 
}); 

cluster.on('online', function (worker) { 
    // worker is alive 
    console.log('Worker %d is alive :', worker.id); 
}); 

app.get('/hey', function(req, res){ 
    console.log('Worker %d running!', cluster.worker.id); 
    res.send('Hello World from worker ' + cluster.worker.id); 
}); 
後で、ワーカーの内部で明示的なオブジェクトの作成をインスタンス化して作成するコードを変更しました(elseループ)。出力は同じです。 4

デバッガポート5859

をリッスンデバッガをリスニング:デバッガは、CPUのポート5858

号をリッスン

if (cluster.isMaster) { 
    var cpuCount = os.cpus().length ; 
    console.log("No. of cpus:", cpuCount); 
    for(var i = 0; i < cpuCount; i++) cluster.fork(); 

    cluster.on('listening', function(worker, address) { 
     console.log('woker id:' + worker.id +' is now listening on port:' + address.port); 
    }); 
} else { 
    var app = express(); 

    console.log("i'm a worker.. ... lets proceed"); 
    var server = app.listen(8082, function(req, res) { 

     var host = server.address().address; 
     var port = server.address().port; 
     request(i18n.__('url.config'), function(error, response, body){ 
      if (!error && response.statusCode == 200) { 
      } else { 
       console.log("Config error",error); 
      } 
     }); 

     app.get('/hey', function(req, res){ 
      console.log('Worker %d running!', cluster.worker.id); 
      res.send('Hello World from worker ' + cluster.worker.id); 
     }); 
    }); // child process 

}// else 

ノード--debug server.js

オンポート5860

デバッガが... ...私は労働者だポート5862

にリスニングポート5861

デバッガでリッスン

woker IDを続行することができます:1は、現在のポートでリッスンしている:8082

私は労働者だ... ...私は労働者だ

を進めることができます... ..私は労働者だ

を進めることができます。.. ...を進めることができます

woker番号:4は、現在のポートでリスニングしている:8082

woker番号:3は、現在のポートでリスニングしている:8082

woker番号:2は、現在のポートでリスニングしている:8082

ワーカー2ランニング!

ワーカー2実行中!

ワーカー2実行中!

ワーカー2実行中!

正しい作業者作成方法は?ポートでリスニングして以来、世界的に明示的なオブジェクトの作成は問題を引き起こすでしょうか?

答えて

0

Node.jsをクラスタリングすると、同じサーバーポートを共有できる別々のプロセスを作成できます。

作業者がメインプロセスから分岐すると、モジュールの先頭からコードが再実行されます。それで、Expressアプリケーションとルートを作成し、指定されたポートで待機します。

しかし、どのように要求が労働者に分かれていますか?明らかに、私たちが受けるすべてのリクエストに対して、彼らは皆聞いて応答することができません。これを処理するために、実際には、異なるワーカー間の要求の配信を処理する、クラスタモジュール内に組み込まれたロードバランサが存在します。 LinuxおよびOSX(Windowsではなく)では、ラウンドロビン(cluster.SCHED_RR)ポリシーはデフォルトで有効です。

異なるプロセスが単一のポートをどのように共有しているのかも知りません。ネットワーク要求を処理する非常に多くのプロセスを実行することの難しい部分は、伝統的に1つしかポートを一度に開くことができないということです。クラスタの大きな利点は、あなたのためのポート共有を処理することです。そのため、あなたが開いているポートは、Webサーバのように、すべての子供がアクセスできるようになります。これは、IPCを介して行われます。つまり、マスターは各ワーカーにポートハンドルを送信します。

cluster.fork()は新しいV8インスタンスを起動します。

注意して使用する必要があります。各ワーカーはシステムリソースを占有するため、実際に必要なものだけを生成します。

あなたの質問に答えるには、これらの2つの方法のいずれかがOKです。

フォークは新しいインスタンスを作成するので、グローバルにオブジェクトを作成しても影響はありません。リンクの下の

はxplanationとリンクのために、cluster.forkとchild_process.fork https://millermedeiros.github.io/mdoc/examples/node_api/doc/cluster.html

+0

おかげについて説明します。 – Martin

関連する問題