Erlangでノードを動的に追加し、global_groupsを追加する
質問
global_group モジュールを使用して、ノードをグループに分割するためのErlangサポート。
さらに、Erlangはノードネットワークへのオンザフライでのノードの追加をサポートしています。これら2つの機能は相互に使用可能ですか?
私の知る限り、グローバルグループを使用するには、起動時にすべてのノードに名前を付ける必要があります。
解決
global_groupソースを見る、ノードのリストは、ノードが同期するときにノードによってチェックされる構成の一部です。
ただし、エクスポートされた関数はあります global_group :global_groups_changed ノードリストの変更を処理します。
kernel:config_change <から呼び出されます( Module:config_change / 3 をご覧ください)したがって、リリースのアップグレード中にglobal_groupに新しいノードを追加することは確かに可能です(OTP組み込みシステムスタイル)(&quot;アプリケーション仕様の更新&quot; )
簡単に実行できる可能性があります :
application:set_env( kernel, global_groups, [GroupTuple|GroupTuples] ),
kernel:config_change( [ { global_groups, [GroupTuple|GroupTuples] } ], [], [] )
すでにglobal_groups設定があると仮定するか、
application:set_env( kernel, global_groups, [GroupTuple|GroupTuples] ),
kernel:config_change( [], [{ global_groups, [GroupTuple|GroupTuples] }], [] )
global_groupsがまだ存在していないクラスターにglobal_groupsを設定している場合。
各ノードで上記を実行する必要があり、プロセス中に同期することに決めた場合、構成の違いの行を分割します。 ( global_group source のコメントを参照してください。 a>リリースアップグレード中の同期について
しかし、それがすべての人に行われると、
global_group:sync()
すべてが再び動作するはずです。
上記のレシピはテストしていませんが、おいしそうです。 ^ _ ^
他のヒント
ノードは実行中のErlangランタイムです 名前が付けられたシステム、 コマンドラインフラグ-nameを使用する (ロングネーム)または-sname(ショートネーム)。
非表示ノードは、次で始まるノードです コマンドラインフラグ-hidden。 非表示ノード間の接続と 他のノードは推移的ではなく、 明示的に設定する必要があります。また、 非表示ノードは表示されません nodes()によって返されるノードのリスト。 代わりに、ノード(非表示)または nodes(connected)を使用する必要があります。この たとえば、隠された ノードはのセットに追加されません グローバルが追跡しているノード。
要するに、はい、他のノードが見つけられるように、ノードに名前を付ける必要があります。
あなたは試していないか、非常に複雑な質問をしているように感じます。おそらくあなたが達成しようとしていることの例は、より良い答えを与えることを可能にするかもしれません。