【问题标题】:Elixir - Erlang: is there a "reasonable" limit of children handled by a supervisor?Elixir - Erlang:主管处理的孩子是否有“合理”限制?
【发布时间】:2018-09-10 01:54:00
【问题描述】:
我正在使用 Elixir,但我相信这个问题也适用于 Erlang。
我正在开发一个系统,该系统可能会创建成千上万个相同类型的组进程。每个小组将有 2 名工人和自己的当地主管。问题是谁来监督当地的主管?
我可以想象两种策略
- 一个大主管,将处理所有本地主管。这种方法很简单,但我相信,每当孩子发生任何事情时,主管都需要遍历其庞大的孩子列表,这将是一项繁重的操作。
- 一棵分区树。例如,一组中间监督员监督大约 1000 名本地监督员,然后是一个全球监督员处理中间监督员。要创建一个新组,全局主管需要找到具有最少孩子的中间主管并将创建工作委派给该中间主管。
这有意义还是有其他方法?欢迎任何建议
【问题讨论】:
标签:
erlang
elixir
erlang-otp
【解决方案1】:
方法一非常有效。只要任何子组拥有自己的本地主管并且后者它不打算崩溃,全局主管就不需要遍历任何东西。
当叶子工作者发生某些事情时,这个 local 主管将负责重新启动它,而 global 主管甚至不会知道那里发生了错误在树下。
OTOH,如果您希望您的 local 主管不时故意崩溃,则每个 local 主管都应该受到自己的监督,例如,intermediate 主管,负责重启。在这种情况下,全局 主管将管理这些中级 主管,一切都会再次变得很酷。
【解决方案2】:
“这取决于”。
“巨大的名单”和“千”真的是在不同的领域。在现代机器上,简单的迭代快速。对于一个经常需要遍历这个大小的列表的系统,对于最高五、低六的项目,我不会感到不安,而且可能我也不会真正关心:
iex(2)> list = Enum.to_list 1..1_000_000; :timer.tc(fn -> Enum.sum list end)
{24497, 500000500000}
(列表遍历和一些算术运算需要 25 毫秒 - 如果崩溃的进程以如此小的延迟重新启动,我通常会很高兴)
当然 - 在一天结束时,您应该进行自己的性能测试,将结果与预期的本地主管崩溃率进行比较,查看您的系统要求,并比较所有这些数据以得出答案.
同时,使用最简单的方法:一个单一的全局监督者监控一个扁平的层次结构。
【解决方案3】:
在 ETS 模式下使用director,不用担心孩子的数量。
在 ETS 模式下,您也可以直接从 Table 中读取一些关于孩子的信息。