【问题标题】:Representing hierarchical structures in otp在 otp 中表示层次结构
【发布时间】:2014-09-18 14:54:49
【问题描述】:

我想更深入地研究一下erlang,因为我有电脑游戏背景,所以我想制作一个非常简单的游戏服务器,没什么花哨的。 我正在考虑创建一个相互连接的太阳能系统的世界,但我不确定如何在主管和 genserver 中表示层次结构。

一种看待它的方式是,太阳系、行星等将成为监督他们孩子的监督者。我想这是行不通的,因为主管并不意味着存储状态,每个行星、月亮等都有一个状态。 这意味着一切都必须是一个 genserver,这导致我需要创建一个 genserver 层次结构的结论。 这与监督者和生成服务器的概念有什么关系?

【问题讨论】:

  • 我有一种预感,您正在尝试在这里合并两个不同的概念:1) 您编写的应用程序模型和 2) 您想要操作的世界/数据模型。有空我会尽量详细说明。
  • 可能是这样。非常感谢您的帮助。

标签: erlang structure erlang-otp


【解决方案1】:

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

通常,在考虑主管时,您会想到崩溃。可以说,持有 Moon 状态的 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

根据重启策略,你现在可以重启整个宇宙,如果宇宙 gen_server 崩溃或整个星球,当它的一个月亮崩溃时,因为你也可以决定在它的一个孩子崩溃时崩溃父主管。

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

【讨论】:

  • 啊,好的。这意味着我将创建我的内容层次结构(如果地球即月亮是孩子),例如带有列表的 gen_servers,并且监督树“只是”用于自动重新启动系统。那讲得通。我过于关注层次结构方面。非常感谢。
  • 现在请记住这将如何影响游戏玩法。月球是一个区域而地球是另一个区域吗?如果是这样,为什么月球上的每个人都应该因为地球区坠毁而被弹跳?在提交层次结构之前,请考虑如何将地图组合在一起。但是现在写something,无论你决定哪种方式——你都会学到一些东西——我的重点是考虑你的监督树将如何影响你的游戏/用户界面/可用性/等。跨度>
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2017-07-15
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多