【问题标题】:Where should one restart `simple_one_for_one`'s children?应该在哪里重新启动 `simple_one_for_one` 的孩子?
【发布时间】:2020-07-22 13:05:44
【问题描述】:

我有一个 Erlang 应用程序,其中我有一个 simple_one_for_one 主管,负责监督一组进程,这些进程监视网页上的变化(每个孩子一个 URL)。

在将相关主管添加到应用程序的顶级主管(以及其他一些进程)之后,我启动了应该在我的应用程序行为的 start 函数中处于活动状态的子项。然后随着条目的添加/删除(并且条目被持久化到数据库中),子项会动态启动和停止。

如果这个 simple_one_for_one 监管者因为太多子节点崩溃(例如由于网络问题)而崩溃,监管者本身会重新启动,但它的子节点会丢失。此时我想检查 DB 并重新启动应该处于活动状态的孩子。

但是,我应该如何重新启动孩子?我怎么知道主管重新启动了?我应该安排从主管自己的start_link 函数启动孩子吗?有没有更好的设计方法?

【问题讨论】:

  • 你不应该有一个以上的主管来管理它吗?
  • @CallamDelaney 不确定你的意思。如果我在 simple_one_for_one 主管之上有一个主管(我已经有了 - 一个 one_for_one 主管还监督其他一些事情),那个主管应该如何知道何时重新启动 simple_one_for_one 主管的孩子?

标签: erlang erlang-supervisor


【解决方案1】:
  1. simple_one_for_one主管的重启策略改为
#{strategy => simple_one_for_one,
                 intensity => 0,
                 period => 1}
  1. 将child的(监听网页变化的进程)terminate/2方法改为
terminate(normal, _State) ->
  %% process terminated normally
  ok;
terminate(_Reason, _State) ->
  %% spawn the child again
  do_supverisor_start_child(),
  ok.

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 2017-05-02
    • 2014-12-09
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多