我想深入了解erlang,因为我有一个电脑游戏背景,我想要制作一个非常简单的游戏服务器,没什么特别的。 我正在考虑建立一个相互关联的太阳系的世界,但我不确定如何在监督者和传播者中代表层级结构。
一种看待它的方法是太阳系,行星等是监督他们孩子的监督者。我认为这不起作用,因为主管并不意味着存储状态,每个行星,月球等都有一个状态。 这意味着一切都必须是一个genserver,这导致我需要创建一个genservers层次结构。 这如何适合主管和传播者的概念?
答案 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
如何相互依赖,如果可以的话 - 让它们尽可能独立。之后,检查监督树的形状,并在发生故障时重新启动策略。