問題タブ [erlang-supervisor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
erlang - one_for_one スーパーバイザーが子を再起動できないことを補う: tcp/ip ポートリスナー
tcp/ip 機能をカプセル化する一般的な動作を作成しました。動作のユーザーがしなければならないことは、ソケットの反対側にあるものから来る、解析された「コマンド」を処理するコールバックを実装することだけです。
私の一般的な動作は、gen_tcp:accept 経由でポートをリッスンするポート リスナー プロセスを作成します。誰かがポートに接続すると、ポートリスナーはスーパーバイザーに新しいポートリスナーをスピンアップするように要求し、その間、接続したばかりのクライアントとのソケット通信を処理します。これらのポート リスナー/ソケット ハンドラーはそれぞれ動的に作成され、同一であるため、simple_one_for_one スーパーバイザーを使用してそれらを作成しています。標準的なもの。
これが私の質問です。ポートをリッスンするプロセスが停止すると、ポートをリッスンするものがないため、動作全体が機能しなくなります。port-listener は simple_one_for_one スーパーバイザによって作成されるため、スーパーバイザは新しい port_listener を再起動できません。
では、「最新の」ポート リスナーを監視し、それが停止した場合に別のポート リスナーを開始するようスーパーバイザーに要求する keep_alive プロセスを作成する必要がありますか? または、このタイプのケースには他のベスト プラクティスがあります。
また、この動作によって作成されたプロセスを確認/調べる方法はありますか? これはアプリケーションではないため、appmon はここでは機能しません。
ありがとう
erlang - Simple_one_for_oneアプリケーション
simple_one_for_oneの子を開始するスーパーバイザーがいます。実際、各子は独自のツリーを持つスーパーバイザーです。それぞれの子供は一意のIDで始まるので、私はそれらを区別することができます。次に、各gen_serverはstart_link(Id)で開始されます。ここで、
したがって、各gen_serverは{global、{Id、module_name}}で簡単に追加できます。
ここで、この子スーパーバイザーをアプリケーションにします。したがって、私の母のスーパーバイザーは、スーパーバイザーではなくアプリケーションを開始する必要があります。IDをアプリケーションに渡すという一部を除いて、これは簡単なはずです。IDでスーパーバイザーを開始するのは簡単です:supervisor:start_child(?SERVER、[Id])。アプリケーションでそれを行うにはどうすればよいですか?同じ名前の複数のアプリケーションを(同じ.appファイルにアクセスできるように)異なるIDで起動するにはどうすればよいですか(子供をsupervisor:start_child(?SERVER、[Id]))で起動できますか?
私の質問が十分に明確でない場合は、ここに私のコードがあります。したがって、現在、es_simulator_dispatcherはes_simulator_supを開始します。これが欲しいのですが、es_simulator_dispatcherはes_simulator_appを開始し、es_simulator_supはes_simulator_supを開始します。それがすべてです:-)
よろしくお願いします、dijxtra
erlang - Erlang: スーパーバイザの下で複数のプロセスを生成する
私は単純なスーパーバイザーを実装しようとしていますが、失敗した場合は子プロセスを再起動するだけです。しかし、スーパーバイザーの下で複数のプロセスを生成する方法さえ知りません! このサイトで簡単なスーパーバイザー コードを調べたところ、何かが見つかりました
init() 関数に「echo_server2」の部分を配置すると、このスーパーバイザーの下で別のプロセスが生成されると想定しましたが、例外 exit:shutdown メッセージが表示されます。
ファイル「echo_server」と「echo_server2」は同じコードですが、名前が異なります。だから私は今混乱しています。
erlang - erlangスーパーバイザーの再起動戦略
特定のスーパーバイザーの子として、いくつかのプロセスを開始したいと思います。再起動の戦略は次のとおりですone_for_one
。私のニーズでは、終了するすべてのプロセスは、指定された時間(たとえば、20秒)後に再起動する必要があります。
これはどのように行うことができますか?たぶん、initまたはterminate関数に次の組み合わせで遅延が発生します。
これを達成するためのより良い方法はありますか?
erlang - Erlang スーパーバイザー。プロセスを再起動します。何度か失敗した場合は、あきらめてメッセージを送信します
gen_server
ハードウェアセンサーからの情報を定期的に要求するワーカーが何人かいます。センサーが一時的に故障する場合がありますが、これは正常です。センサーが失敗した場合、ワーカーは例外で終了します。
simple_one_to_one
すべてのワーカーは、戦略を持つスーパーバイザーから生成されます。またgen_server
、ワーカーを開始および停止し、'DOWN'
メッセージを受信できるコントロールもあります。
だから今私は2つの問題があります:
ワーカーがスーパーバイザーによって再起動されると、その状態が失われます。これは私には受け入れられません。同じ状態でワーカーを再作成する必要があります。
ワーカーが一定期間に数回失敗する場合は、センサーに重大な問題が発生しており、オペレーターの注意が必要です。したがって、ワーカーの再起動をあきらめて、イベント ハンドラーにメッセージを送信する必要があります。ただし、スーパーバイザーのデフォルトの動作は、プロセスの再起動制限を使い果たした後に終了します。
2 つの解決策があります。
スーパーバイザでプロセスのタイプを一時的に設定し、それらを制御して、制御で再起動します
gen_server
。しかし、これはまさにスーパーバイザーが行うべきことなので、車輪を再発明しています。メイン スーパーバイザーの下に各ワーカーのスーパーバイザーを作成します。これは私の 2 番目の問題を正確に解決しますが、再起動後にワーカーの状態が失われるため、ワーカーの状態を格納する ets テーブルのようなストレージが必要です。
私は Erlang に非常に慣れていないので、(もしあれば) どの解決策が最適かについて、私の問題に対するアドバイスが必要です。前もって感謝します。
erlang - スーパーバイザーは、アトミック操作として複数の子を開始します
アトミックな方法で複数のスーパーバイザーの子を開始する必要があります。つまり、グループ内の子の1つが起動時に失敗した場合、どの子も起動しないでください。
私はこの操作を関数として見ています:
これを適切な方法で実装するにはどうすればよいですか?例、ライブラリなどはありますか?私の直感によると、リストからすべての子を開始し、すべてが成功したかどうかを確認してから、残りの子を殺すのは方法ではありません。
それとも、私のデザインに欠陥があり、本当にそのようなことをする必要はないのでしょうか?
debugging - Erlang で関数呼び出しをトレースするには?
my_sup.erl に次のような関数があります。
しかし、ems_media.erl に start_link/1 という名前の関数がありません。実行時にエラーが発生しない理由を知りたいです。
では、init([ems_media_sup]) を呼び出した後、次に何が起こったかを知る方法
erlang - simple_one_for_one の子が起動できません
simple_one_for_one スーパーバイザーをテストするコードをいくつか書きますが、動作しません。コードは次のとおりです。
私が走るとき
test_simple_one_for_one:start_link().
と
erl シェルでは、次のエラーが表示されます。
test_simple_one_for_one:start_fun_test(). ** 例外終了: 関数 gen_server:call/3 の {noproc,{gen_server,call, [test_simple_one_for_one,{start_child,[]},infinity]}} (gen_server.erl、188 行目)
erlang - ibrowseを処理するためのerlangスーパーバイザーの最良の方法:send_reqconn_failed
アーランは初めてで、新しいパラダイムに頭を悩ませるのに少し苦労しています!
OK、それで私はOTPgen_server内にこの内部関数を持っています:
接続が失敗した場合の処理を省略した場合、終了シグナルがスーパーバイザーに伝播され、サーバーとともにシャットダウンされます。
私がしたいこと(少なくともこれが私がしたいことだと思います)は、接続障害時に一時停止してからsend_reqを10回再試行すると、その時点でスーパーバイザーが失敗する可能性があることです。
私がこのような醜いことをしたら...
サーバープロセスをシャットダウンし、はい、失敗するまで(10秒以内に10回試行)再起動戦略を使用できます。これも望ましい結果ですが、サーバーからスーパーバイザーへの戻り値は「ok」です。本当に{error、error_but_please_dont_fall_over_mr_supervisor}を返したいです。
このシナリオでは、プロセスを停止させてからスーパーバイザーに再起動させて再試行するのではなく、「my_func」内で失敗した接続を再試行するなど、すべてのビジネスを処理することになっていると強く思います。
質問:このシナリオでの「Erlangの方法」とは何ですか?
erlang - eshell からスーパーバイザを起動しようとすると、スーパーバイザがクラッシュしますか?
私はOTPに非常に慣れていません。スーパーバイザーの動作を理解するための簡単な例を作成しようとしています:
これが単純なインクリメントサーバーです
そして、このモジュールによって監視されるようにしたいと思います:
その後、次の手順を erlang シェルで実行しました。
この後、次に試しました(予想どおり、エラーが発生しました):
この後、私は期待していました-私のスーパーバイザーが再起動しinc_serv
ます。しかし、それはしませんでした:
何が起こったのか理解するのを手伝ってくれませんか? そして、再起動できるようにするには、スーパーバイザーをどのように書き直すべきですかinc_serv
ありがとう