erlang 如何在Elixir中建立主管树模型

lvjbypge  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(148)

假设我有一个Zone动态管理器(zone是一个生成服务器),每个Zone都有自己的Player动态管理器(Player是一个生成服务器)。
所以每个区域都有很多玩家,我也有很多区域。
这样做的方式只是在区域生成服务器中存储播放器管理器的PID吗?
这是正确的方法吗?然后当我启动一个区域时,也启动一个玩家监督?
这是纯粹的概念,我是新的做这类事情。我会感谢任何学习资源,这方面以及!

w8rqjzmb

w8rqjzmb1#

PlayerSupervisor的PID存储到ZoneGenServer中?
如果PlayerSupervisor由于某种原因崩溃,这将是不够健壮的。一种方法是使ZoneGenServer陷阱存在于相应的PlayerSupervisor中,并在PlayerSupervisor崩溃时崩溃,但这意味着您正在实现已经提供的OTP的一部分。我将使用以下方法(ZoneSupervisor:rest_for_one策略启动,所有其他以:one_for_one策略启动):

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

现在,当我们可以安全地防止崩溃时,唯一的事情就是让ZoneGenServer知道PlayerSupervisor。这可以通过询问ZoneSupervisor关于它的子进程和/或通过向{:via, module, term}注册名称来完成。使用PID作为进程处理程序容易受到进程重启(由于崩溃等)的攻击。PID更改,注册的名称不会。

相关问题