我正在使用 Elixir,但我相信这个问题也适用于 Erlang。
我正在开发一个系统,该系统可能会创建成千上万个同类的组进程。每个小组将有 2 名工人和一名当地主管。问题是谁来监督当地的监管者?
我可以想象两种策略
有道理还是有其他方法?有任何意见欢迎欢迎
“这取决于”。
“庞大名单”和“数千”确实是不同的境界。在现代机器上,简单的迭代是“快”的。对于经常需要遍历如此大小的列表的系统,我不会有任何疑虑,最多可达最高的五个,最低的六个项目,而且可能超过这个我也不会真正关心:
iex(2)> list = Enum.to_list 1..1_000_000; :timer.tc(fn -> Enum.sum list end)
{24497, 500000500000}
(列表遍历和一些算术运算需要 25 毫秒 - 如果崩溃的进程以如此小的延迟重新启动,我通常会很高兴)
当然 - 在一天结束时,您需要进行自己的性能测试,将结果与预期的本地主管崩溃率进行比较,查找系统的要求,并比较所有这些数字以得出答案。
同时,使用最简单可行的方法:单个全局主管监控扁平层次结构。
监督者,全局监督者就不需要遍历任何东西,而后者它不打算崩溃。 当叶子工作者发生问题时,这个
local主管将负责重新启动它,而global主管甚至不知道树中发生了错误。 OTOH,如果您预计您的
local主管有时会故意崩溃,则每个 local 主管都应该受到自己的(例如,中级)主管的监督,该主管将负责其重新启动。在这种情况下,globalsupervisor将管理这些intermediatesupervisor,一切都会再次变得很酷。 使用
我很确定,如果你尝试一下,主管可以轻松地处理数十万,甚至数百万的孩子,没有任何问题。
过早优化是万恶之源。