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

7 crash erlang state exit erlang-supervisor

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

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

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

如果gen_server崩溃,我希望它重新启动,但应该使用最新的天气状态重新启动,而不是使用硬编码的任意状态init().由于碰撞,模拟状态突然从"冰雹风暴"变为"愉快和轻松"是没有意义的.

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

the*_*mue 5

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

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

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