erlang - 达到 max_restart_intensity 的主管如何才能删除有问题的 child ?

标签 erlang erlang-otp erlang-supervisor

我有一个 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 策略和临时 子级。

在此监督程序下运行的每个监督程序都将正确配置 MaxRMaxT 值,一旦子级行为不当,将触发该监督程序崩溃。

当较低级别的主管崩溃时,顶级主管“只是不在乎”。

当以一个子进程(总堆大小)启动时,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/

相关文章:

erlang - 我应该将静态文本文件放在哪里才能成为 OTPy?

erlang - 为什么 simple_one_for_one 在调用 start_child 时不能指定不同的子 ID?

erlang - 了解 ejabberd filter_packet Hook 参数

erlang - 如何检查 ETS Erlang/Elixir 中是否存在命名表

testing - 使用通用测试的模块的 Erlang 测试(非导出/私有(private))功能

erlang - erlang 中的事件管理器进程。命名进程或 Pids?

erlang - 如何找到 OTP 流程的主管?

java - 选择用于实现分布式消息传递算法的编程语言

random - Erlang 生成随机二进制文件