2

私には、one_for_one似たような完全に独立した子供を扱う監督者がいます。

1人の子供に問題がある場合、クラッシュとトリガーを繰り返します。

=SUPERVISOR REPORT==== 30-Mar-2011::13:10:42 ===
     Supervisor: {local,gateway_sup}
     Context:    shutdown
     Reason:     reached_max_restart_intensity
     Offender:   [{pid,<0.76.0>}, ...

自分自身をシャットダウンし、それ以外の場合は正常に実行し続けるすべての無実の子供たちを終了させます。

標準のErlangスーパーバイザーから監視ツリーを構築するにはどうすればよいですか?これは、問題のある1人の子の再起動を停止し、他の子をそのままにします。

一人っ子で上司を増員することを考えていましたが、これは私には重いようです。

これを処理する他の方法はありますか?

4

1 に答える 1

6

最善の解決策は、2層の監督を行うことだと思います。

実行するスーパーバイザーごとにスーパーバイザーとプロセスのペアを開始する1つのスーパーバイザーgen_server。このスーパーバイザーは、one_for_oneストラテジーとtemporary子で構成されます。

このスーパーバイザーの下で実行されている各スーパーバイザーは、正しく構成MaxRされ、MaxT値が設定されているため、子が誤動作すると、そのスーパーバイザーのクラッシュがトリガーされます。

下位レベルのスーパーバイザーがクラッシュすると、上位レベルのスーパーバイザーは「気にしません」。

スーパーバイザーは、1つの子(合計ヒープサイズ)で開始したときに233バイトを消費するため、メモリ消費は問題になりません。

監視ツリーは次のようになります。

supervisor_top
    |
    |
    +------------------------+-----    ...
    |                        |
 supervisor_1               supervisor_2
 restart temporary          restart temporary
    |                         |
  gen_server_1              gen_server_2
  restart transient         restart transient
于 2011-03-30T12:36:25.623 に答える