假设我有一个Zone动态管理器(zone是一个生成服务器),每个Zone都有自己的Player动态管理器(Player是一个生成服务器)。所以每个区域都有很多玩家,我也有很多区域。这样做的方式只是在区域生成服务器中存储播放器管理器的PID吗?这是正确的方法吗?然后当我启动一个区域时,也启动一个玩家监督?这是纯粹的概念,我是新的做这类事情。我会感谢任何学习资源,这方面以及!
w8rqjzmb1#
将PlayerSupervisor的PID存储到ZoneGenServer中?如果PlayerSupervisor由于某种原因崩溃,这将是不够健壮的。一种方法是使ZoneGenServer陷阱存在于相应的PlayerSupervisor中,并在PlayerSupervisor崩溃时崩溃,但这意味着您正在实现已经提供的OTP的一部分。我将使用以下方法(ZoneSupervisor以:rest_for_one策略启动,所有其他以:one_for_one策略启动):
PlayerSupervisor
ZoneGenServer
ZoneSupervisor
:rest_for_one
:one_for_one
———————————————————— | ZoneSupervisor | ———————————————————— ⇓ ⇓ ———————————————————— —————————————————— | PlayerSupervisor | | ZoneGenServer | ———————————————————— —————————————————— ⇓ ———————————————————— | PlayerGenServer | ————————————————————
现在,当我们可以安全地防止崩溃时,唯一的事情就是让ZoneGenServer知道PlayerSupervisor。这可以通过询问ZoneSupervisor关于它的子进程和/或通过向{:via, module, term}注册名称来完成。使用PID作为进程处理程序容易受到进程重启(由于崩溃等)的攻击。PID更改,注册的名称不会。
{:via, module, term}
PID
1条答案
按热度按时间w8rqjzmb1#
将
PlayerSupervisor
的PID存储到ZoneGenServer
中?如果
PlayerSupervisor
由于某种原因崩溃,这将是不够健壮的。一种方法是使ZoneGenServer
陷阱存在于相应的PlayerSupervisor
中,并在PlayerSupervisor
崩溃时崩溃,但这意味着您正在实现已经提供的OTP的一部分。我将使用以下方法(ZoneSupervisor
以:rest_for_one
策略启动,所有其他以:one_for_one
策略启动):现在,当我们可以安全地防止崩溃时,唯一的事情就是让
ZoneGenServer
知道PlayerSupervisor
。这可以通过询问ZoneSupervisor
关于它的子进程和/或通过向{:via, module, term}
注册名称来完成。使用PID
作为进程处理程序容易受到进程重启(由于崩溃等)的攻击。PID
更改,注册的名称不会。