すべてのノードウォーカープロセスは、同じアプリケーションの新しいコピーを実行しているかのように動作しているようです。しかし、ノードクラスタ内のすべてのノードワーカー(子プロセス)が共有するいくつかの変数を保持したいと考えています。これを行う簡単な方法はありますか?ノードクラスタ内のすべてのノードプロセスを共有する変数を保持する方法は?
答えて
すべてのワーカープロセスは、実際にアプリケーションの新しいコピーです。各ワーカーは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!');
私は、クラスタの全体的なアイデアは、上の独立して実行できるインスタンスをしていると思います異なるCPU。両方がアクセスして変更できるメモリ(グローバル変数)を共有すると、複雑さが増し(ロックなど)、これらのインスタンスが互いに依存するようになります。
外部データベースは、すべてのデータアクセスの問題を処理するので、これに対する良い解決策ですが、パフォーマンスが低下する可能性が最も高いです。
メッセージングは良いアイデアです。あなたは、あなたのクラスタ内のvarのローカルインスタンスを保持することができます。クラスタによって値が更新されると、残りの部分にメッセージが送信され、値が更新されます。非同期でノンブロッキングですが、値の更新がすぐに反映されることはないので、これは素晴らしいことです。
これはどうですか:データベースにvarsを保存し、値の変更があるたびにインスタンスに通知します。彼らはローカルバールに新しい値を格納し、必要なときにのみdbコールを行うことができます
私は外部のmemcachedまたはredisサーバを使用しました。
例を教えていただけますか?私はマスターからフェッチするためにmemcacheの子からデータセットをフェッチしようとしていますが、動作していません – mithra
これは答えとしてのコメントより多くのものです – renatoargh
読み取り専用で物事を共有する場合は、mmap-objectをご覧ください。大規模なメモリ内ルックアップテーブルに使用します。
346Mファイルはサーバー上で合計156Mのメモリ(アクセスされたページでのみmmap)と、プロセスあたりのオーバーヘッドが3.5Mのmmap-objectを44個のプロセスで共有しています。
私は読み取り専用なので、私はプロセス間のロックや持ち運びが難しいことを心配する必要はありません。
- 1. laravelのすべてのユーザーに共通の変数を保持する方法
- 2. テンソルフローライブラリ内の共有変数を保存
- 3. RSpec変数を共有コンテキスト間で共有する方法は?
- 4. 共有メモリにC++マップデータ構造を保持する方法は?
- 5. クロージャー内の変数の値を保持する方法
- 6. C#とJavaScriptの間で変数を共有する方法は?
- 7. Swift 3のサブクラス間で変数を共有する方法は?
- 8. marshmallowのデフォルト共有を使って共有する方法は?
- 9. 複数のビュー/ XIB間で変数を共有する方法
- 10. symfony2のTWIGを使ってすべてのテンプレートの変数を共有する
- 11. 変数を共有する
- 12. すべてのAzure関数インスタンス間でオブジェクト状態を共有する方法
- 13. Pythonでスレッド間でグローバル変数を共有する方法は?
- 14. twitter-bootstrapとjinja2でモーダル変数を共有する方法は?
- 15. モジュール間で同じ変数を共有する方法は?
- 16. ソケットハンドラ間で変数を共有する方法は?
- 17. すべてのビューを1つに保持する方法は?
- 18. 共有サーバーのpublic_htmlフォルダを保護する方法は?
- 19. Linuxで共有開発のコードを保護する方法は?
- 20. theano共有変数のグラディエントを監視する方法
- 21. TensorflowでRNNの変数を共有する方法
- 22. 2 appとAngularJSの間で変数を共有する方法
- 23. 共有クラス変数を適切に保存するには?
- 24. ノードクラスタはマスタとクラスタ間でデータを共有します
- 25. Graphlab Sframes - groupby内のすべての列を保持する方法
- 26. ProGuardでクラス内のすべてのメソッドを保持する方法
- 27. スレッドを分割してもJava内の共通変数を保持します
- 28. 共有プリファレンスのすべてのキーを反復処理する方法は?
- 29. 共有機能オブジェクトをDjangoのメモリに保持するには?
- 30. すべてのビューで変数を共有するためのLaravelサービスプロバイダ
redisのようなデータベースを調べましたか?方法があるとしても、適切なロック機構がなければ、これは悪い考えのように聞こえる。 –
@Aaron Dufourは返事を感謝します。はい。 redisは一つの選択肢です。私もそれについて考えました。しかし、データベースを使用せずにそれを行うことはできませんか? –
このような方法はないと思います。たとえば、 'process.send'と' worker.send'( 'cluster'文書を参照)を使って、何かを考え出すことができますが、安全でも高速でもありません。 Redisのような一時的なデータストアは間違いなく最良の選択肢です。 –