すべてのノード ワーカー プロセスが、同じアプリケーションの新しいコピーを実行しているかのように動作しているようです。ただし、ノード クラスター内のすべてのノード ワーカー (子プロセス) によって共有されるいくつかの変数を保持したいと考えています。これを行う簡単な方法はありますか?
6 に答える
すべてのワーカー プロセスは、アプリケーションの新しいコピーです。各ワーカーは、child_process.spawn で作成されたフル機能のプロセスです。いいえ、変数を共有しません。そして、おそらくこの方法が最適です。ワーカー プロセス (通常はセッション) 間で情報を共有したい場合は、これらの情報をデータベースに格納することを検討する必要があります。
ノードに完全に移行する準備ができている場合は、dnodeなどを使用して、ワーカーにマスター プロセスにデータを要求させることができます。
マスター プロセスと子プロセスの間で通信を試みることができます。例えば:
スクリプト 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!');
外部の memcached または redis サーバーを使用しました。
クラスターの全体的な考え方は、異なる CPU で独立して実行できるインスタンスを持つことだと思います。両方がアクセスして変更できるメモリ (グローバル変数) を共有すると、複雑さが増し (ロックなど)、これらのインスタンスが相互に依存するようになります。
外部データベースは、すべてのデータ アクセスの問題を処理するため、これに対する優れたソリューションですが、パフォーマンスが低下する可能性が高くなります。
メッセージングはより良い考えです。クラスター内に var のローカル インスタンスを保持できます。クラスターが値を更新すると、残りのクラスターにメッセージを送信して値を更新します。これは非同期でノンブロッキングであるため素晴らしいですが、値の更新はすぐには反映されません。
これはどうですか: 変数をデータベースに保存し、値が変更されるたびにインスタンスに通知します。新しい値をローカル変数に保存し、必要な場合にのみ db 呼び出しを行うことができます
読み取り専用で共有したい場合は、 mmap-objectをチェックしてください。大規模なメモリ内ルックアップ テーブルに使用します。
サーバーで今確認すると、346M ファイルは合計 156M のメモリ (アクセスされたものの mmap のみのページ) を占有し、mmap-object は 44 のプロセス間でそれを共有し、プロセスあたりのオーバーヘッドは 3.5M です。
読み取り専用であるため、プロセス間ロックやそれに伴う煩雑さについて心配する必要はありません。