如何在崩溃后恢复进程状态?

时间:2009-05-10 23:34:04

标签: erlang crash state exit supervisor

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

两个 - 更复杂 - 替代方案:

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

答案 1 :(得分:2)

  

有更简单的方法吗?

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

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

对不起我的英语:)