Elixir - Erlang:主管是否处理 "reasonable" 的 children 限制?

Elixir - Erlang: is there a "reasonable" limit of children handled by a supervisor?

我正在使用 Elixir,但我相信这个问题也适用于 Erlang。

我正在开发一个系统,该系统可能会创建成千上万个相同类型的进程组。每个小组将有 2 名工人和一名当地主管。问题是谁来监督地方监督员?

我可以想象两种策略

  1. 一个主管将处理所有本地主管。这种方法很简单,但我相信每当 child 出现问题时,主管将需要遍历其庞大的 children 列表,这将是一项繁重的操作。
  2. 一个分区树。例如,一组中级主管监督大约 1000 名本地主管,然后是全球主管处理中间主管。要创建一个新组,全局主管将需要找到具有最少 children 的中级主管并将创建委托给它。

有没有道理或者有其他办法吗?欢迎任何建议

方法一非常有效。 global supervisor 不需要遍历任何东西,只要任何子组都有自己的 local supervisor 而后者 it not intended崩溃.

当 leaf worker 发生某些事情时,这个 local supervisor 会负责重新启动它,而 global supervisor 不会'甚至都不知道树下出了什么问题。

如果,OTOH,你希望你的 local 主管不时故意崩溃,每个 local 主管都应该受到监督有自己的,比如说,intermediate supervisor,它将负责它的重新启动。 global supervisor 将在这种情况下管理这些 intermediate supervisors,一切都会再次变得很酷。

"It depends"。

"huge list"和"thousands"真的是不同境界。简单迭代在现代机器上是 快速。最高五项,最低六项我对经常必须遍历这个大小的列表的系统没有任何疑虑,而且可能超过这个我也不会真正关心:

iex(2)> list = Enum.to_list 1..1_000_000; :timer.tc(fn -> Enum.sum list end) {24497, 500000500000}

(列表遍历和一些算法需要 25 毫秒 - 如果崩溃的进程以如此小的延迟重新启动,我通常会很高兴)

当然 - 在一天结束时,您需要进行自己的性能测试,将结果与预期的本地主管崩溃率进行比较,查看您的系统要求,并将所有这些数据进行比较以得出结论答案。

同时,使用可能可行的最简单的方法:单个全局主管监控扁平层次结构。

在 ETS 模式下使用 director,不用担心 children 的数量。 在 ETS 模式下,您也可以直接从 Table 中读取有关 children 的一些信息。