Elixir - Erlang:主管处理的儿童是否有“合理”限制?

问题描述 投票:0回答:4

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

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

我可以想象两种策略

  1. 一名主管将处理所有当地主管。这个方法很简单,但我相信每当一个孩子发生什么事时,主管都需要遍历其巨大的孩子列表,这将是一个繁重的操作。
  2. 一个分区树。例如,一组中级主管负责监督大约 1000 名本地主管,然后由一个全局主管负责处理中级主管。要创建一个新组,全局主管需要找到孩子最少的中级主管,并将创建任务委托给该主管。

有道理还是有其他方法?有任何意见欢迎欢迎

erlang elixir erlang-otp
4个回答
3
投票

“这取决于”。

“庞大名单”和“数千”确实是不同的境界。在现代机器上,简单的迭代是“快”的。对于经常需要遍历如此大小的列表的系统,我不会有任何疑虑,最多可达最高的五个,最低的六个项目,而且可能超过这个我也不会真正关心:

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


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

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

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


0
投票
本地

监督者,全局监督者就不需要遍历任何东西,而后者它不打算崩溃 当叶子工作者发生问题时,这个

local

主管将负责重新启动它,而global主管甚至不知道树中发生了错误。 OTOH,如果您预计您的

local

主管有时会故意崩溃,则每个 local 主管都应该受到自己的(例如,中级)主管的监督,该主管将负责其重新启动。在这种情况下,globalsupervisor将管理这些intermediatesupervisor,一切都会再次变得很酷。 使用



0
投票

我很确定,如果你尝试一下,主管可以轻松地处理数十万,甚至数百万的孩子,没有任何问题。

过早优化是万恶之源。

© www.soinside.com 2019 - 2024. All rights reserved.