重新启动Erlang进程和维护状态(Restarting erlang process and pr

2019-08-02 06:23发布

我有一个主管的过程,开始的子进程的数量。 目前,当孩子死我都会产生新的PID一个新的进程。 这意味着我失去了刚刚去世我的子进程的状态信息。 我想我的客户使用总是相同的标识子进程进行通信。 尽管子进程可能会死,并由主管重新启动。

我想唯一的名字注册的子进程,并在ETS表中存储的孩子的状态。 现在的问题是 - 什么是Erlang的接近这样的问题的建议呢?

谢谢!

Answer 1:

在ETS表中存储过程的状态将工作围绕保持崩溃之间的状态,我通常使用全局注册表给了流程持久性名称。 (玩家200将被登记为{播放器,200}),因为它需要你使用原子,如果你有很多子进程,可以通过咀嚼你的原子极限着急,我不建议使用本地注册表动态地创建他们(如player_200,player_201等)

在ETS表中存储的孩子州都有自己的风险和问题,虽然。 如果孩子一时之间崩溃时发生错误,当它保存到ETS表,你应该是好的。 但是,如果你处理,导致孩子以节省垃圾状态数据,然后会崩溃处理下一个消息? 你会重新启动的过程中,从ETS表加载状态不好,并再次崩溃在你的下一条消息。 当然,还有的方法来解决这个问题,但你应该知道,这是一个可能性,并解决它。

虽然二郎隐藏分发ETS表中的所有进程的问题,它在CPU和潜在的争论为代价的。 如果你推了很大的变化,以您的ETS表,你会在性能上付出代价。

如果你的孩子崩溃,你不应该寻找一种方式让他们删除错误的情况啊? 我通常会采取进程崩溃的东西,我需要的根本原因和修复。 ?



Answer 2:

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

正如@ user30997指出,该表中的数据实际上可能是进程崩溃的原因,所以在重新启动您可能需要验证表(或设置的过程中会多少次重新启动限制......)

对于关联ID为的过程,你应该看一看GPROC这是伟大的这一点。



Answer 3:

使用eventsourcing,坚持所有事件,并重播回到重建的状态。 如果您需要快速的录像,做一个快照。 下面的例子: https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-oslo

事实上,这将是很好的建立基于这个例子的完整框架。



文章来源: Restarting erlang process and preserving state
标签: erlang