8

重新启动崩溃的进程时保持状态的好方法是什么?

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

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

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

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

4

2 回答 2

5

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

两个更复杂的替代方案:

  • 构建一对进程,一个用于工作,一个用于状态维护。由于第二个的简单性,它将非常可靠。
  • 一个真正愚蠢的可能是每次状态发生变化时将主管的子规范与当前状态作为参数进行交换。(微笑)不,开玩笑的。
于 2009-05-11T06:48:59.440 回答
3

有没有更简单的方法?

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

无论如何,我真的没有看到将 State 存储在 mnesia 中的问题。

对不起我的英语:)

于 2009-05-11T10:35:27.307 回答