我有一个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
子级。
在该主管下运行的每个主管将正确配置MaxR
和MaxT
值,一旦子行为不当,将触发该主管崩溃。
当下级主管崩溃时,上级主管“根本不在乎”。
超级用户从一个孩子(总堆大小)开始时消耗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/