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监督员建立一个监督树,只停止重新启动一个违规的孩子并让其他人独自离开?
我正在考虑只有一个孩子的额外主管,但这对我来说似乎是重量级的.
还有其他办法吗?
我认为最好的解决方案是进行两层监督.
一个主管为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
Run Code Online (Sandbox Code Playgroud)