gen_server重新启动策略复制状态吗?

时间:2018-11-06 15:21:05

标签: erlang elixir beam

Erlang世界不像往常一样使用try-catch。我想知道以主流语言重启进程与try-catch时的性能如何。

Erlang进程具有小的堆栈和堆概念,实际上是在OS堆中分配的。为什么重新启动有效?

希望有人让我深入了解Beam在进程上调用重启操作时该怎么做。

此外,如何使用gen_server维护进程中的状态。 gen_server重新启动时会导致复制状态运行吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我建议阅读https://ferd.ca/the-zen-of-erlang.html

我的理解是:重新启动对于修复“ Heisenbug”有效,仅当(Erlang)进程处于某种怪异状态和/或尝试处理“怪异”消息时才会发生。

推测是您恢复到已知的良好状态(通过重新启动),该状态应正确处理所有正常消息。重新启动并不是要“解决所有问题”,当然也不是因为配置错误或缺少互联网连接等原因。通过这个定义,我们可以看到在崩溃发生时复制状态并尝试从中恢复非常危险,因为这破坏了回到已知状态的全部目的。

第二点是,仅当处理仅占您所有用户实际使用的0.001%(或任何百分比可以忽略的百分比)的操作时,该过程才会崩溃,并且它并不是很重要(例如,较小的UI细节),完全可以让它崩溃并重新启动,并且无需修复。我认为这可以为这些情况带来生产力。


关于OP注释中的问题:是的,无论您的init回调返回什么,您都可以在那里建立整个起始状态,也可以从其他地方获取,完全取决于用例。