代表otp中的层次结构

时间:2014-09-17 06:11:51

标签: erlang structure otp

我想深入了解erlang,因为我有一个电脑游戏背景,我想要制作一个非常简单的游戏服务器,没什么特别的。 我正在考虑建立一个相互关联的太阳系的世界,但我不确定如何在监督者和传播者中代表层级结构。

一种看待它的方法是太阳系,行星等是监督他们孩子的监督者。我认为这不起作用,因为主管并不意味着存储状态,每个行星,月球等都有一个状态。 这意味着一切都必须是一个genserver,这导致我需要创建一个genservers层次结构。 这如何适合主管和传播者的概念?

1 个答案:

答案 0 :(得分:1)

通常,最好在多个gen_servers之间拆分状态,但内容层次结构不必与监督树连接。您可以阅读有关supervision principles的更多信息。

一般来说,在考虑主管时,你会考虑崩溃。可以说,gen_server持有月球状态崩溃了。问题是:地球是否依赖于月球的状态?如果是,那么你必须在月亮崩溃后重新启动地球gen_server这是一个预感,他们必须在一个主管下one_for_all重新启动策略。如果他们是独立的,你可以将你所有的天体置于一个主管下,one_for_one重新启动策略,它与实际内容层次结构无关。

如果您决定需要该层次结构,则可以这样做:

- application supervisor
    + universe gen_server
    - univserse supervisor
         + solar system gen_server
         - solar system supervisor
             + planet gen_server
             - planet supervisor
                 + moon gen_server
                 + moon2 gen_server
         + another solar system gen_server
         - another solar system supervisor

根据重新启动策略,您现在可以重新启动整个Universe,如果Universe gen_server崩溃或整个行星,当其中一个月球崩溃时,因为当其中一个孩子崩溃时,您也可以决定让父级主管崩溃

所以 - 先考虑gen_servers如何相互依赖,如果可以的话 - 让它们尽可能独立。之后,检查监督树的形状,并在发生故障时重新启动策略。