16

マルチコア マシン (別名クラスタリング) を利用する nodejs アプリケーションを構築しようとしていますが、セッションについて質問を受けました。私のコードは次のようになります。

var cluster = exports.cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {

  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died. Trying to respawn...');
    cluster.fork();
  });

} else {

//spawn express etc

}

私の質問は: 1 人のユーザーがランダムなノード インスタンスにヒットするたびに、またはたとえば、最初にページを開いてノード N4 にヒットし、セッションが期限切れになるまで、すべての要求でノード N4 にヒットしますか? 私の質問を理解していない人のために、私が心配していることを説明しようとします: ユーザーが私のページに入り、ノード N3 にログインし、次に req.session.userdata をランダムなデータに設定し、彼はページを開き、彼がノード N4 にアクセスした場合、別のノードから req.session.userdata にアクセスできますか? つまり、ユーザーがランダムにログアウトされる可能性があるということですか、それともエクスプレスを使用したクラスタリングがどのように機能するのか理解していないだけですか?

4

1 に答える 1

13

Connect/Express のメモリ内セッション ストアが複数のインスタンスをサポートするのに適していないことは間違いありません。解決策は、バッキング データベースを使用してセッション ストアを実装することです。私の推奨は connect-redis で、サンプル コードはSession Undefined - Using Connect-Redis / ExpressJS / Node にあります。

しかし、何十ものオプションがあります。

于 2013-07-14T00:56:25.513 に答える