我有一个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>}, ...


关闭自己,并终止所有否则会继续正常运转的无辜儿童。

我该如何从标准的Erlang主管中构建一个监督树,该监督树只会停止重新启动一个有问题的孩子,而让其他孩子独自一人?

我当时正在考虑只有一个孩子的情况下增加一名主管,但这对我来说似乎很沉重。

还有其他方法可以解决吗?

最佳答案

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

一个主管,它为您要运行的每个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

关于erlang - 达到了max_restart_intensity的主管只能删除有问题的 child 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5485736/

10-10 02:58