【问题标题】:How do supervisor processes monitor processes? Can the same be done on the JVM?主管进程如何监控进程?可以在JVM上做同样的事情吗?
【发布时间】:2009-07-19 04:12:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: erlang fault-tolerance


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,这很有意义。在机器之间发送消息与在本地进程之间发送消息似乎很常见(更大的开销,更多的失败原因等)。因此,对您的应用程序进行编码以了解这一点(没有灵丹妙药可以使本地/远程调用相同,所以不要尝试)。这意味着 JVM 中的类似模型当然是可能的。只监督本地进程/线程/光纤/actors/whatever,并将代码写入您的应用程序对其他节点的 ping 操作(以及如果您无法访问一个节点该怎么办)。
    【解决方案2】:

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

    【讨论】:

    • 谢谢 - 这是一个有趣的帖子。我在那里留下了一条消息,试图确定它是否支持网络连接。我有一种感觉(可能不正确),它正在查看 JVM 中的其他内容,并且没有处理跨进程边界问题。但如果一切顺利,那就太好了!
    【解决方案3】:

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

    【讨论】:

    • 谢谢,但我希望只有 Java 虚拟机(没有 Erlang 虚拟机)。让事情变得更简单(政治上)。
    【解决方案4】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 2010-09-21
      相关资源
      最近更新 更多