我有一个 one_for_one
主管来处理类似且完全独立的 child 。
当一个 child 出现问题时,反复崩溃并触发:
=SUPERVISOR REPORT==== 30-Mar-2011::13:10:42 ===
Supervisor: {local,gateway_sup}
Context: shutdown
Reason: reached_max_restart_intensity
Offender: [{pid,<0.76.0>}, ...
关闭自身并终止所有无辜的 child ,否则他们将继续正常运行。
我怎样才能用标准的 Erlang 监督者构建一棵监督树,只停止重新启动一个有问题的 child ,而不会影响其他 child ?
我正在考虑增加一名主管,只带一个 child ,但这对我来说似乎很重要。
还有其他方法可以解决这个问题吗?
最佳答案
我认为最好的解决方案是有两层监督。
一个主管为您要运行的每个gen_server
启动一个主管+进程对。该主管配置了 one_for_one
策略和临时
子级。
在此监督程序下运行的每个监督程序都将正确配置 MaxR
和 MaxT
值,一旦子级行为不当,将触发该监督程序崩溃。
当较低级别的主管崩溃时,顶级主管“只是不在乎”。
当以一个子进程(总堆大小)启动时,Supervisor 会消耗 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/