Erlang には、tcp/ip 接続を受け入れるプロセスを含むプロセスのスーパーバイザー ツリーがあります。着信接続ごとに、新しいプロセスを生成します。このプロセスをスーパーバイザー ツリーに追加する必要がありますか?
よろしく、スティーブ
Erlang には、tcp/ip 接続を受け入れるプロセスを含むプロセスのスーパーバイザー ツリーがあります。着信接続ごとに、新しいプロセスを生成します。このプロセスをスーパーバイザー ツリーに追加する必要がありますか?
よろしく、スティーブ
はい、これらのプロセスを監視階層に追加する必要があります。これは、アプリケーションが停止したときにプロセスを正しく/正常にシャットダウンするためです。(そうしないと、接続が依存しているアプリケーション インフラストラクチャがシャットダウンされているため、接続がリークして失敗することになります)。
の子仕様を持つsimple_one_for_one
戦略スーパーバイザー sayを作成できます。通常、接続ハンドラには有用な再起動戦略がないため、ここでのタイプは重要です。クライアントに接続して接続を再起動することはできません。ここでは、スーパーバイザが接続ハンドラの終了を報告しますが、それ以外の場合は無視します。yourapp_client_sup
{Id, {yourapp_client_connection, start_link_with_socket, []}, Restart, Shutdown, worker, temporary}
temporary
temporary
を実行するプロセスは、ではなくgen_tcp:accept
実行して接続ハンドラ プロセスを作成します。関数がor関数 (モジュールの要件) を介して子を開始し、関数がソケットの制御を子に転送することを確認します。そうしないと、子はソケットを使用できなくなります。supervisor:start_child(yourapp_client_sup, [Socket,Options,...])
yourapp_client_sup:start_link(Socket, Options, ...)
youreapp_client_connection:start_link_with_socket
gen_server
proc_lib
supervisor
gen_tcp:controlling_process
別の方法として、起動時にプロセスがリンクできるダミーyourapp_client_sup
プロセスを作成する方法があります。yourclient_connection_handler
プロセスは、その親から接続ハンドラ プロセスにメッセージyourapp_client_sup
を伝達するためだけに存在します。EXIT
存在をトラップEXIT
し、親からのメッセージ以外のすべてのメッセージを無視する必要があります。全体として、私はsimple_one_for_one
スーパーバイザー アプローチを使用することを好みます。
これらのプロセスが多いと予想される場合は、責任を分離するためにメインスーパーバイザーの下にスーパーバイザーを追加することをお勧めします(simple_one_for_one
設定を使用して、現在の場合よりも単純にすることもできます)。
重要なのは、これらのプロセスを制御する必要がある場合は、スーパーバイザーがいることは常に素晴らしいことです。それらが成功するかどうかは問題ではない場合、あなたはそれを必要としないかもしれません。しかし、繰り返しになりますが、私はいつもそれがずさんなコーディングだと主張します。;-)
それらがどこから来たのかが非常に明白で、かなり少ない場合を除いて、私がしない唯一のことは、それらを既存のツリーに追加することです。