如何在 Elixir 中建模主管树

Posted

技术标签:

【中文标题】如何在 Elixir 中建模主管树【英文标题】:How to model a supervisor tree in Elixir 【发布时间】:2021-05-03 07:17:18 【问题描述】:

假设我有一个 Zone 动态主管(zone 是一个 genserver),每个 Zone 都有自己的 Player 动态主管(player 是一个 genserver)。

所以每个区域都有很多玩家,而我有很多区域。

这样做的方法是否只是将 Player supervisor 的 PID 存储在 Zone GenServer 中?

这是正确的方法吗?然后当我启动一个区域时也启动一个玩家主管?

这纯粹是概念性的,我是做这种事情的新手。我也将不胜感激任何有关这方面的学习资源!

【问题讨论】:

【参考方案1】:

只是将PlayerSupervisor的PID存储在ZoneGenServer中?

如果PlayerSupervisor 因某种原因崩溃,这将不够健壮。一种方法是使相应的PlayerSupervisor 存在ZoneGenServer 陷阱,并在PlayerSupervisor 崩溃时崩溃,但这意味着您正在实施已经提供的部分OTP。我会选择以下内容(ZoneSupervisor:rest_for_one strategy 开头,所有其他人以 :one_for_one 开头):


           ————————————————————
           |  ZoneSupervisor  |
           ————————————————————
               ⇓          ⇓
————————————————————  ——————————————————
| PlayerSupervisor |  |  ZoneGenServer |
————————————————————  ——————————————————
         ⇓
————————————————————
|  PlayerGenServer |
————————————————————

现在,当我们可以安全地避免崩溃时,唯一的办法就是让ZoneGenServer 意识到PlayerSupervisor。可以通过向ZoneSupervisor 询问其子代和/或通过name registration 和:via, module, term 来完成。使用PID 作为进程处理程序容易受到进程重启(由于崩溃等)的影响。PID 更改,注册名称不会。

【讨论】:

以上是关于如何在 Elixir 中建模主管树的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Elixir 主管中引用之前启动的进程

在 Elixir ExUnit 中,我如何保证 Supervisor 将创建一个新的 GeNserver?

Elixir 中的动态主管规范

Elixir Redix 基于名称的池示例 - 主管签名不存在

Elixir - 基本主管设置崩溃而不是重新启动子进程

Erlang - Elixir:啥是监督树?