主管如何监控流程?可以在JVM上完成相同的操作吗?

时间:2009-07-19 04:12:11

标签: erlang fault-tolerance

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

Erlang如何进行此监控,尤其是在分布式方案中?怎么能确定这个过程真的死了?它会做心跳吗?内置于运行时环境中的是什么?如果拔下网络电缆怎么办?如果无法与其通信,是否会假设其他进程已经死亡?等

我在考虑如何在JVM(例如Java或Scala)中实现Erlang声称的相同容错等。但我不确定是否需要内置于JVM中的支持以及Erlang。虽然作为一个比较点,我还没有看到Erlang如何做到的定义。

4 个答案:

答案 0 :(得分:5)

Erlang OTP监管通常不在不同节点上的进程之间完成。它会起作用,但最佳做法是采用不同的方式。

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

此ping表示检测节点关闭时存在延迟。检测死对等节点(或死链接节点)可能需要几秒钟。

如果主管和流程在本地运行,那么崩溃和向主管发出的信号几乎是即时的。它依赖于异常崩溃传播到链接进程的功能,这些进程也会崩溃,除非它们捕获出口。

答案 1 :(得分:0)

似乎有人实施了similar strategy in Scala。我的期望是,主管会将网络故障视为失败的子流程,而Scala流程的文档似乎也证明了这一点。

答案 2 :(得分:0)

我认为你的意思是由Supervisor处理portmapper。 您可以通过JInterface使用Erlang portmapper / infrastructure - 因此您可以避免重新发明轮子 - 如果您仍然需要它,您至少可以获得所有接口。

答案 3 :(得分:-1)

Erlang是开源的,这意味着你可以download the source并获得关于Erlang如何做到的明确答案。

  

Erlang如何进行此监控,尤其是在分布式方案中?怎么能确定这个过程真的死了?它会做心跳吗?内置于运行时环境中的是什么?

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

  

如果拔下网络电缆怎么办?如果无法与他们通信,是否会假设其他进程已经死亡?等

在Erlang中,您可以选择监控节点,并接收{node_up, Node}{node_down, Node}条消息。我假设如果您无法再与节点通信,也会发送这些内容。你如何处理它们取决于你。