4

Erlang には、tcp/ip 接続を受け入れるプロセスを含むプロセスのスーパーバイザー ツリーがあります。着信接続ごとに、新しいプロセスを生成します。このプロセスをスーパーバイザー ツリーに追加する必要がありますか?

よろしく、スティーブ

4

2 に答える 2

4

はい、これらのプロセスを監視階層に追加する必要があります。これは、アプリケーションが停止したときにプロセスを正しく/正常にシャットダウンするためです。(そうしないと、接続が依存しているアプリケーション インフラストラクチャがシャットダウンされているため、接続がリークして失敗することになります)。

の子仕様を持つsimple_one_for_one戦略スーパーバイザー sayを作成できます。通常、接続ハンドラには有用な再起動戦略がないため、ここでのタイプは重要です。クライアントに接続して接続を再起動することはできません。ここでは、スーパーバイザが接続ハンドラの終了を報告しますが、それ以外の場合は無視します。yourapp_client_sup{Id, {yourapp_client_connection, start_link_with_socket, []}, Restart, Shutdown, worker, temporary}temporarytemporary

を実行するプロセスは、ではなく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_socketgen_serverproc_libsupervisorgen_tcp:controlling_process

別の方法として、起動時にプロセスがリンクできるダミーyourapp_client_supプロセスを作成する方法があります。yourclient_connection_handlerプロセスは、その親から接続ハンドラ プロセスにメッセージyourapp_client_supを伝達するためだけに存在します。EXIT存在をトラップEXITし、親からのメッセージ以外のすべてのメッセージを無視する必要があります。全体として、私はsimple_one_for_oneスーパーバイザー アプローチを使用することを好みます。

于 2008-10-07T13:25:40.727 に答える
2

これらのプロセスが多いと予想される場合は、責任を分離するためにメインスーパーバイザーの下にスーパーバイザーを追加することをお勧めします(simple_one_for_one設定を使用して、現在の場合よりも単純にすることもできます)。

重要なのは、これらのプロセスを制御する必要がある場合は、スーパーバイザーがいることは常に素晴らしいことです。それらが成功するかどうかは問題ではない場合、あなたはそれを必要としないかもしれません。しかし、繰り返しになりますが、私はいつもそれがずさんなコーディングだと主張します。;-)

それらがどこから来たのかが非常に明白で、かなり少ない場合を除いて、私がしない唯一のことは、それらを既存のツリーに追加することです。

于 2008-09-30T18:59:38.787 に答える