Erlang - Elixir:啥是监督树?

Posted

技术标签:

【中文标题】Erlang - Elixir:啥是监督树?【英文标题】:Erlang - Elixir: What is a supervision tree?Erlang - Elixir:什么是监督树? 【发布时间】:2018-03-15 05:34:58 【问题描述】:

我正在做一个教程,上面写着“在本指南中,我们将学习如何构建一个完整的 Elixir 应用程序,以及它自己的监督树、配置、测试等等”。 p>

简而言之,Elixir 中的监督树是什么?

谢谢!

【问题讨论】:

您可能会觉得这很有帮助:The most basic Erlang service ⇒ worker pattern 另外两个可靠的参考:Erlang: Supervision Principles 和 LYSE: Who Supervises the Supervisors? 【参考方案1】:

在 Erlang 和 Elixir 应用程序中,结构是由一个***“主管”进程强加的,该进程启动应用程序中的其他进程。那些其他进程可以包括其他监督者,它们也有自己的孩子,这种递归结构采用树的形状,因此是“监督树”。进程的监督是 Erlang/Elixir 的容错特性,因为故障被隔离到树的某个分支,该分支的主管可以重新启动失败的子节点,或者也允许自己失败,从而将故障冒泡到树中的下一个最高主管。

【讨论】:

关于自愈监督树的很好解释kodius.com/blog/elixir-supervision-tree【参考方案2】:

既然你已经标记了Erlang,我将回答这个Erlang的观点。但是 Erlang 和 Elixir 几乎是一回事。

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

例如,

Java使用多线程(多线程)来处理 并发 Go 使用 channels 来处理并发 同样,Erlang 使用 actor 模型 来处理并发。

简单英语的演员模型

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

    主管 工人

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

工作进程用于执行某些任务。而已。它将执行分配给它的任何任务,然后就死了。如果它由于非正常原因而死亡/崩溃,其主管将重新启动工作进程以执行其预期任务。

所以总的来说,我们可以有一个根主管(称为 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 模型的好地方。

【讨论】:

以上是关于Erlang - Elixir:啥是监督树?的主要内容,如果未能解决你的问题,请参考以下文章

如何从受监督的工作进程中触发 Elixir 主管树终止

Elixir - 在监督下启动 Java JInterface OTP 节点

如何解释 Erlang 的监督树?

Erlang:我应该以编写任务调度程序结束啥监督树?

混合 Elixir 和 Erlang?

Elixir Enum vs Erlang列表