重新启动Erlang过程并保留状态



i有一个主管过程,该过程启动了几个子进程的数量。目前,当孩子死亡时,我带有新的PID过程。这意味着我失去了刚刚死亡的孩子过程的状态信息。我希望我的客户使用始终使用相同标识符与儿童流程进行沟通。尽管儿童进程可能会死亡并由主管重新启动。

我正在考虑注册具有独特名称的儿童流程,并将子状态存储在ETS表中。问题是 - 在Erlang中解决此类问题的推荐方法是什么?

谢谢!

在ETS表中存储过程状态将有效地在崩溃之间保持状态,并且我通常使用全局注册表来提供过程持续的名称。(播放器200将注册为{player,200}。)我不建议使用本地注册表,因为它需要您使用原子,如果您有很多子过程,则可以急忙咀嚼原子极限动态创建它们(例如Player_200,Player_201等)

在ETS表中存储儿童状态有其自身的风险和问题。如果一个孩子在发生错误的那一刻到保存到ETS表的那一刻,您应该没事。但是,如果您处理导致孩子保存垃圾状态的数据,那么处理下一条消息时会崩溃?您将重新启动该过程,从ETS表中加载不良状态,然后再次崩溃。当然有可以解决此问题的方法,但是您应该意识到这是一种可能性并解决的可能性。

虽然Erlang隐藏了将ETS表分配到所有过程的问题,但它以CPU和潜在的争论为代价。如果您将很多更改推向ETS表,则将在性能中付费。

如果您的孩子崩溃了,您是否应该寻找一种方法来删除错误的条件?我通常会将过程崩溃作为根本原因和修复所需的东西。?

使用ETS表可能是保持状态的方法。Vinoski的文章讨论了如何在保留ETS表数据的同时重新启动崩溃的过程。

@user30997指出表中的数据实际上可能是该过程崩溃的原因,因此在重新启动时,您可能需要验证表(或设置该过程将重新启动多少次...)

对于将过程与ID关联,您应该查看GPROC,这对此非常有用。

使用Eventsourcing,持续所有事件,然后重新建立状态。如果您需要快速重播,请进行快照。下面的示例:https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-oslo

实际上,基于此示例构建一个完整的框架将很不错。

最新更新