2

我有一个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 监督者中构建监督树,只停止重新启动一个有问题的孩子而让其他孩子独自一人?

我正在考虑增加一个只带一个孩子的主管,但这对我来说似乎很重要。

还有其他方法来处理这个吗?

4

1 回答 1

6

我认为最好的解决方案是有两层监督。

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
于 2011-03-30T12:36:25.623 回答