2013-02-12 4 views
16

すべてのノードウォーカープロセスは、同じアプリケーションの新しいコピーを実行しているかのように動作しているようです。しかし、ノードクラスタ内のすべてのノードワーカー(子プロセス)が共有するいくつかの変数を保持したいと考えています。これを行う簡単な方法はありますか?ノードクラスタ内のすべてのノードプロセスを共有する変数を保持する方法は?

+2

redisのようなデータベースを調べましたか?方法があるとしても、適切なロック機構がなければ、これは悪い考えのように聞こえる。 –

+0

@Aaron Dufourは返事を感謝します。はい。 redisは一つの選択肢です。私もそれについて考えました。しかし、データベースを使用せずにそれを行うことはできませんか? –

+1

このような方法はないと思います。たとえば、 'process.send'と' worker.send'( 'cluster'文書を参照)を使って、何かを考え出すことができますが、安全でも高速でもありません。 Redisのような一時的なデータストアは間違いなく最良の選択肢です。 –

答えて

14

すべてのワーカープロセスは、実際にアプリケーションの新しいコピーです。各ワーカーはchild_process.spawnで作成されたフル機能のプロセスです。 だから、変数を共有しません。それはおそらくこのように最善です。 ワーカープロセス(通常はセッション)間で情報を共有する場合は、これらの情報をデータベースに保存する必要があります。

ノードを途中まで進む準備が整ったら、dnodeのようなものを使用して、作業者にマスタープロセスにデータを要求させることができます。

+0

dnodeのリンクが 'File not found'ページ – zavg

+1

になりました。ありがとうございます、私はgithub repoを指し示しました。 – Floby

+0

私はredisやキー値ストアではできないメディアパイプライン(インスタンス化オブジェクト)を渡す必要があります。 – Antoine

12

マスタープロセスと子プロセスの間の通信を試みることができます。たとえば:

スクリプトはtest.master.js:

var cluster = require('cluster'); 
var childScript = __dirname + '/test.child.js'; 

cluster.setupMaster({ exec: childScript }); 

proc = cluster.fork(); 
proc.on('message', function(message) { 
    console.log('message from child: ', message); 
    proc.send('Hello from master!'); 
}); 

スクリプトはtest.child.js:

console.log('Child initializing..'); 

process.on('message', function(message) { 
    console.log('message from master: ', message); 
}); 

process.send('Hello from Child!'); 
2

私は、クラスタの全体的なアイデアは、上の独立して実行できるインスタンスをしていると思います異なるCPU。両方がアクセスして変更できるメモリ(グローバル変数)を共有すると、複雑さが増し(ロックなど)、これらのインスタンスが互いに依存するようになります。

外部データベースは、すべてのデータアクセスの問題を処理するので、これに対する良い解決策ですが、パフォーマンスが低下する可能性が最も高いです。

メッセージングは​​良いアイデアです。あなたは、あなたのクラスタ内のvarのローカルインスタンスを保持することができます。クラスタによって値が更新されると、残りの部分にメッセージが送信され、値が更新されます。非同期でノンブロッキングですが、値の更新がすぐに反映されることはないので、これは素晴らしいことです。

これはどうですか:データベースにvarsを保存し、値の変更があるたびにインスタンスに通知します。彼らはローカルバールに新しい値を格納し、必要なときにのみdbコールを行うことができます

4

私は外部のmemcachedまたはredisサーバを使用しました。

+1

例を教えていただけますか?私はマスターからフェッチするためにmemcacheの子からデータセットをフェッチしようとしていますが、動作していません – mithra

+0

これは答えとしてのコメントより多くのものです – renatoargh

0

読み取り専用で物事を共有する場合は、mmap-objectをご覧ください。大規模なメモリ内ルックアップテーブルに使用します。

346Mファイルはサーバー上で合計156Mのメモリ(アクセスされたページでのみmmap)と、プロセスあたりのオーバーヘッドが3.5Mのmmap-objectを44個のプロセスで共有しています。

私は読み取り専用なので、私はプロセス間のロックや持ち運びが難しいことを心配する必要はありません。

関連する問題