主管进程如何监控进程?同样可以在JVM上完成吗?

主管进程如何监控进程?同样可以在JVM上完成吗?

问题描述:

Erlang的容错能力(据我了解)包括使用主管进程来关注工作进程,所以如果一个工人死了,主管可以启动一个新进程。主管进程如何监控进程?同样可以在JVM上完成吗?

Erlang如何进行这种监测,特别是在分布式情况下?如何确定这个过程真的死了?它有心脏跳动吗?是什么内置到运行时环境?如果拔下网线会怎么样 - 假设其他进程已经死了,如果它不能与它们通信?等等

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

Erlang OTP监督通常不在不同节点上的进程之间完成。它会工作,但最好的做法是以不同的方式做。

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

此ping表示在检测节点故障时存在延迟。检测一个死的对等节点可能需要几秒钟的时间(或者到它的死链接)。

如果主管和流程在本地运行,那么崩溃和发送给主管的信号非常实在。它依赖于异常崩溃传播到崩溃的链接进程的功能,除非它们陷入退出。

+0

谢谢,这很有道理。在机器之间发送消息不同于在本地进程之间发送消息(更大的开销,更多的原因可能会失败等)似乎是常见的事情。所以编写你的应用程序来了解这一点(没有银弹让本地/远程调用一样,所以不要尝试)。 这意味着JVM中的类似模型当然有可能。只监督本地进程/线程/光纤/行动者/任何,并将代码写入您的应用程序ping其他节点(以及如果您无法到达某个节点时该怎么办)。 – 2009-07-22 13:58:11

看起来有人实施了similar strategy in Scala。我的期望是,一位主管将网络故障视为一个失败的子进程,并且Scala进程的文档似乎承认了这一点。

+0

谢谢 - 这是一个有趣的帖子。我留下了一条消息,试图解决它是否支持网络连接。我感觉到(可能不正确),它正在监视JVM中的其他内容,而没有处理跨进程边界问题。但是,如果一切正常,那就太棒了! – 2009-07-20 12:54:41

我认为你的意思是由Supervisor处理portmapper。 您可以通过JInterface来使用Erlang portmapper /基础架构 - 因此您可以避免重新发明* - 如果您仍然需要它,您至少可以获得那里描述的所有接口。

+0

谢谢,但我希望只有Java虚拟机(没有Erlang虚拟机)。保持简单(政治上)。 – 2009-07-20 12:58:41

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

Erlang如何做这种监测,特别是在分布式情况下?如何确定这个过程真的死了?它有心脏跳动吗?是什么内置到运行时环境?

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

如果拔下网线会怎么样 - 假设其他进程已经死亡,如果它无法与它们通信?等等。

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