达到_max_restart_intensity的主管如何才能删除违规儿童?

Pee*_*ger 2 erlang erlang-otp erlang-supervisor

我有一个one_for_one主管,处理类似和完全独立的孩子.

当一个孩子出现问题时,反复崩溃并触发:

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

关闭自己,并终止所有无辜的孩子,否则将继续运行良好.

如何用标准的Erlang监督员建立一个监督树,只停止重新启动一个违规的孩子并让其他人独自离开?

我正在考虑只有一个孩子的额外主管,但这对我来说似乎是重量级的.

还有其他办法吗?

Ada*_*erg 5

我认为最好的解决方案是进行两层监督.

一个主管为gen_server您想要运行的每个启动主管+进程对.该主管配置了one_for_one策略和temporary子项.

在该主管下运行的每个主管都将具有正确配置MaxRMaxT值,一旦孩子行为不当就会触发该主管的崩溃.

当下级主管崩溃时,顶级主管"只是不关心".

当一个孩子(总堆大小)启动时,主管消耗233个字节,因此内存消耗不应成为问题.

监督树应如下所示:

supervisor_top
    |
    |
    +------------------------+-----    ...
    |                        |
 supervisor_1               supervisor_2
 restart temporary          restart temporary
    |                         |
  gen_server_1              gen_server_2
  restart transient         restart transient
Run Code Online (Sandbox Code Playgroud)