Erlang 为什么只有一个监督树而不是一个集中的监督树?

Erlang 为什么只有一个监督树而不是一个集中的监督树?,erlang,elixir,erlang-supervisor,Erlang,Elixir,Erlang Supervisor,我正在学习Elixir和Erlang/OTP,并想了解在构建高可用性系统时拥有一个监控树的重要性 我可以看出主管在管理员工流程生命周期中的重要性。但是,我仍然想知道,为什么有些应用程序需要以层次结构的形式组织主管,而不是仅仅由一名主管来管理所有工人?拥有我天真地忽视的这种结构有什么实际好处吗 借用书中的一个例子,在哪种情况下,我们更喜欢第一种结构而不是第二种结构 1. MainSupervisor ├── StashWorker └── SubSupervisor

我正在学习Elixir和Erlang/OTP,并想了解在构建高可用性系统时拥有一个监控树的重要性

我可以看出主管在管理员工流程生命周期中的重要性。但是,我仍然想知道,为什么有些应用程序需要以层次结构的形式组织主管,而不是仅仅由一名主管来管理所有工人?拥有我天真地忽视的这种结构有什么实际好处吗

借用书中的一个例子,在哪种情况下,我们更喜欢第一种结构而不是第二种结构

1.  MainSupervisor
    ├── StashWorker
    └── SubSupervisor
        └──SequenceWorker

2.  MainSupervisor
    ├── StashWorker
    └── SequenceWorker

您可能忽略了著名的“让它崩溃”哲学,它使进程崩溃并重新启动OTP中的一等公民。我们不会将流程崩溃视为失败,而是将其视为一个机会,可以在不需要手动处理错误的情况下正确地重做

主要原因是允许对发生故障时应该重新启动的内容进行更细粒度的控制。为此,我们有。或者,正如@Andree在评论中重申的:

通过在层次结构中组织监控,我们可以更细粒度地控制当系统的一个子集出现故障时系统应如何响应

想象一下,这个应用程序有一个负责远程连接的进程和一组进程,所有这些进程都使用这个资源。当连接进程崩溃时,无论如何,它都会被其主管重新启动,但其
pid
会发生变化。这意味着依赖此
pid
的所有进程也应该重新启动。使用
:rest\u for_one
策略,很容易开箱即用

此特定示例的另一种方法是管理进程中的连接,在树的另一部分中进行监督,并在连接出现问题时手动使池的主管崩溃,使用此连接重新初始化所有池

更重要的是,我们可能希望手动使处理此连接的进程崩溃,以重新初始化它,而不是编写防御代码,如
如果没有连接,请执行:重新加载配置和重新启动连接
我们只是让它崩溃,然后由具有新的正确配置的监控树重新初始化


最后但并非最不重要的一点是,如果监管机构不捕获出口,它也会崩溃,并将其向上传播。这样,我们就可以在不编写代码的情况下重新初始化监督树的整个分支。

感谢您提供了信息丰富的答案。我想你的回答了我的问题。如果我可以简明扼要地说,通过在层次结构中组织监督,我们可以更细粒度地控制当系统的一个子集出现故障时系统应如何响应。是的,没错,我要用这句话修改我的答案。