8

Erlang 容错(据我所知)包括使用主管进程来监视工作进程,因此如果一个工作进程死亡,主管可以启动一个新进程。

Erlang 如何进行这种监控,尤其是在分布式场景中?如何确定进程真的死了?它会心跳吗?运行时环境中是否内置了某些东西?如果拔下网线怎么办 - 如果无法与其他进程通信,它是否假定其他进程已经死亡?等等

我正在考虑如何在 JVM(比如 Java 或 Scala)中实现 Erlang 所声称的相同的容错性等。但我不确定它是否需要 JVM 内置的支持才能和 Erlang 一样。尽管作为比较点,但我还没有遇到过 Erlang 是如何做到这一点的定义。

4

4 回答 4

5

Erlang OTP 监督通常不在不同节点上的进程之间进行。它会起作用,但最好的做法是用不同的方式来做。

常见的方法是编写整个应用程序,使其在每台机器上运行,但应用程序知道它并不孤单。并且应用程序的某些部分有一个节点监视器,因此它知道节点故障(这是通过简单的网络 ping 完成的)。这些节点宕机可用于更改负载平衡规则或转移到另一个主节点等。

此 ping 意味着在检测节点故障时存在延迟。检测死对等节点(或死链接)可能需要几秒钟的时间。

如果主管和进程在本地运行,崩溃和给主管的信号几乎是瞬间的。它依赖于一个特性,异常崩溃会传播到链接进程,除非它们捕获退出,否则这些进程也会崩溃。

于 2009-07-20T14:38:03.907 回答
0

似乎有人在 Scala 中实施了类似的策略。我的期望是主管会将网络故障视为失败的子流程,Scala 流程的文档似乎证实了这一点。

于 2009-07-19T05:25:29.620 回答
0

我认为您的意思是主管进程端口映射器。您可以通过JInterface使用 Erlang 端口映射器/基础设施- 这样就可以避免重新发明轮子 - 如果您仍然想要它,您至少可以获得那里描述的所有接口。

于 2009-07-19T06:04:54.283 回答
-1

Erlang 是开源的,这意味着您可以下载源代码并获得有关 Erlang 如何做到这一点的明确答案。

Erlang 如何进行这种监控,尤其是在分布式场景中?如何确定进程真的死了?它会心跳吗?运行时环境中是否内置了某些东西?

我相信它是在 BEAM 运行时完成的。当一个进程死亡时,一个信号会发送到与其链接的所有进程。有关完整讨论,请参阅Programming Erlang的第 9 章。

如果拔下网线怎么办 - 如果无法与其他进程通信,它是否假定其他进程已经死亡?等等

在 Erlang 中,您可以选择监视一个节点,并接收{node_up, Node}{node_down, Node}消息。我假设如果您不能再与节点交谈,这些也会被发送。你如何处理它们取决于你。

于 2009-07-21T02:16:38.767 回答