重启崩溃进程时保持状态的好方法是什么?
我在OTP应用程序中有一个主管,它监视几个“子系统”gen_servers。
例如,一个是“天气”子系统,它每15分钟生成一个新的天气状态,并处理当前天气状况的查询。 (想想柠檬水摊位游戏)
如果gen_server崩溃,我希望它重新启动,但应该使用最新的天气状态重新启动,而不是init()
中的某些任意状态硬编码。模拟状态突然从“冰雹风暴”转变为“愉快轻松”仅仅是因为崩溃是没有意义的。
由于增加的复杂性,我不愿意在每次更新后使用mnesia或ETS存储状态;有更简单的方法吗?
答案 0 :(得分:4)
只要它必须在运行期间,就会建议使用ETS。该值远远大于复杂性。 API很简单,如果您使用的是命名表,访问也很简单。您只需在主管启动gen_server之前创建表。
两个 - 更复杂 - 替代方案:
答案 1 :(得分:2)
有更简单的方法吗?
当进程死亡时,它会向包含进程状态的主管发送消息,因此您可以使用此值存储在主管(在mnesia或主管的状态中)以及服务器何时启动(在 init 中)它必须向主管发送同步调用以获取状态值。我没有真正的例子,但我希望它有意义。
无论如何,我真的没有看到将状态存储在mnesia中的问题。
对不起我的英语:)