【问题标题】:How can I restore process state after a crash?崩溃后如何恢复进程状态?
【发布时间】:2010-10-25 04:23:19
【问题描述】:

在重启崩溃的进程时有什么好的方法来保持状态?

我在 OTP 应用程序中有一个主管,负责监视多个“子系统”gen_server。

例如,一个是“天气”子系统,它每 15 分钟生成一个新的天气状态并处理对当前天气状态的查询。 (想想柠檬水摊游戏)

如果该 gen_server 崩溃,我希望它重新启动,但它应该以最近的天气状态重新启动,而不是在 init() 中硬编码的任意状态。仅仅因为坠机,模拟状态突然从“冰雹风暴”变成“轻松愉快”是没有意义的。

由于增加了复杂性,我犹豫是否在每次更新后使用 mnesia 或 ETS 来存储状态;有没有更简单的方法?

【问题讨论】:

    标签: erlang crash state exit erlang-supervisor


    【解决方案1】:

    只要它必须在运行时,就会建议使用 ETS。价值远远大于复杂性。 API 很简单,如果您使用命名表,访问也很简单。您只需在主管启动您的 gen_server 之前创建表。

    两个更复杂的替代方案:

    • 构建一对进程,一个用于工作,一个用于状态维护。由于第二个的简单性,它真的很可靠。
    • 一个真正愚蠢的做法可能是在每次状态发生变化时将主管的子规范与当前状态作为参数进行交换。 (微笑)不,开个玩笑。

    【讨论】:

      【解决方案2】:

      有没有更简单的方法?

      当进程死亡时,它会向主管发送包含进程状态的消息,因此您可以使用此值存储在主管中(在 mnesia 或主管的状态中)以及您的服务器何时启动(在 init ) 它必须向主管发送同步调用以获取状态值。我没有真实的例子,但我希望它有意义。

      无论如何,在 mnesia 中存储 State 并没有什么问题。

      对不起我的英语:)

      【讨论】:

      • supervisor 应该包含尽可能少的逻辑并且只负责重启。该逻辑中的单个错误可能导致整个子树崩溃。
      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 2013-01-02
      • 2016-05-21
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多