Erlang - Elixir:什么是监督树?

Erlang - Elixir: What is a supervision tree?

我正在做一个教程,它说 "In this guide, we will learn how to build a complete Elixir application, with its own supervision tree, configuration, tests and more"。

简单来说,Elixir 中的监督树是什么?

谢谢!

在 Erlang 和 Elixir 应用程序中,通过 top-level "supervisor" 进程启动应用程序中的其他进程来强加结构。这些其他进程可以包括其他主管,它们也有自己的 children,并且这种递归结构采用树的形状,因此 "supervision tree"。进程监督赋予 Erlang/Elixir 它的容错特性,因为故障被隔离到树的某个分支,该分支的监督者可以重新启动失败的 children,或者允许自己失败好吧,将故障冒泡到树中的下一个最高主管。

既然你tag了Erlang,我就以Erlang的角度来回答一下。但是 Erlang 和 Elixir 几乎是一回事。

Erlang 是一种面向并发的编程语言。这意味着它是为处理并发而建立的。 telecommunication/protocol 相关应用程序特别需要的一项主要功能。几乎每种编程语言都有处理并发操作的机制。

例如,

  • Java使用multiple threads(多线程)来处理 并发性
  • Go 使用通道 来处理并发
  • 同样,Erlang 使用actor 模型 来处理并发。

演员模型通俗易懂

在 actor 模型中,我们有两种类型的进程。

  1. 监事
  2. 工人

基本上主管是监督工作进程的。而已。如果我们想创建一个工作进程来执行某些工作,我们会要求主管为我们创建它。如果工人死了,主管会为你重新启动它。您无需担心工作进程的健康状况。此外 主管也可以其他主管。

工作进程在那里执行一些任务。而已。它会执行分配给它的任何任务,然后就死了。如果它 dies/crash 由于不正常的原因,它的主管将重新启动工作进程以执行其预期任务。

总的来说,我们可以让一个根主管(称之为 S0)管理 2 个主管 S1、S2。 S2 管理另一个主管 S3。 S3 监督 5 个工作进程,即 W1-W5。整个层次结构是 Erlang/Elixir 中的 监督树。

这是 RADIUS 协议相关项目中的示例监督树。 https://github.com/sigscale/radierl/blob/master/doc/supervision.png

还有很多与 actor 模型相关的内容,例如消息传递等。This 将是了解 actor 模型的好地方。