【问题标题】:How to discover that a Scala remote actor is died?如何发现一个 Scala 远程演员死了?
【发布时间】:2011-05-17 07:29:48
【问题描述】:

在 Scala 中,当另一个(远程)actor 终止时,可以通过设置 trapExit 标志并以第二个 actor 作为参数调用 link() 方法来通知一个 actor。在这种情况下,当远程参与者通过调用 exit() 结束其工作时,第一个参与者通过接收退出消息来通知。

但是当远程参与者以不那么优雅的方式终止时会发生什么(例如,它正在运行的 VM 崩溃)?换句话说,本地参与者如何发现远程参与者不再可用?当然,我希望(如果可能的话)可以通过类似于退出消息的消息通知本地参与者,但这似乎不可行。我错过了什么吗?我应该不断地轮询远程参与者的状态(在这种情况下,我不知道哪种方法是最好的)还是有更聪明的解决方案?

【问题讨论】:

标签: scala exit actor fault-tolerance remote-actors


【解决方案1】:

但是当远程参与者以不那么优雅的方式终止时会发生什么(例如,它正在运行的 VM 崩溃)

Actor 代理保持活动状态,接受消息(并丢失它们),并等待您使用远程 Actor 重新启动 JVM。监视 JVM 崩溃(以及基础设施级别上发生的其他故障)远远超出了 Scala 的职责。不错的选择是通过 JMX 进行监控。

换句话说,本地参与者如何发现远程参与者不再可用?

您可以定义一个超时间隔(比如 5000 毫秒)。如果远程 Actor 在此间隔内没有回复,则表明远程 Actor 发生了意外情况,您可以询问它的状态或将其视为已死亡。

我应该不断地轮询远程参与者的状态(在这种情况下,我不知道哪种方法是最好的)还是有更聪明的解决方案?

您可以将一种轮询负载均衡器/调度程序放在一组演员前面,它只会使用那些活着并准备好处理消息的演员(这对于可能突然出现的远程演员是有意义的/消失在代理后面)-> Can Scala actors process multiple messages simultaneously?

【讨论】:

    【解决方案2】:

    Actors in Scala 书中提到(未经个人测试):

    捕获终止通知。

    在某些情况下,将终止通知作为消息接收到监控参与者的邮箱中很有用。
    例如,监控参与者可能希望重新引发某个链接参与者未处理的异常。
    或者,监控参与者可能想要对正常终止做出反应,这在默认情况下是不可能的。

    可以使用BooleantrapExit 标志将参与者配置为在其邮箱中接收所有终止通知作为正常消息。在以下示例中,演员 b 将自身链接到演员 a

    val a = actor { ... }
    val b = actor {
    self.trapExit = true
    link(a)
    ...
    }
    

    请注意,在演员b 调用链接之前,它会将其trapExit 成员设置为true
    这意味着每当链接的演员终止(正常或异常)时,它都会收到退出类型的消息
    因此,每当actor a 终止时,actor b 都会收到通知(假设actor ab 调用链接之前没有终止)。

    那么“当远程参与者以不那么优雅的方式终止时会发生什么”?
    即使在异常终止的情况下,它也应该收到Exit 消息。

    val b = actor {
      self.trapExit = true
      link(a)
      a ! 'start
      react {
        case Exit(from, reason) if from == a =>
        println("Actor 'a' terminated because of " + reason)
      }
    }
    

    【讨论】:

    • "即使在异常终止的情况下,它也应该收到退出消息。"它应该,但实际上它不会。幕后没有什么魔法——所有链接都会被明确通知,当actor通过exit()方法终止时,当带有链接actor的JVM死掉时,什么都不会发生。
    • “这意味着每当链接的参与者终止(正常或异常)时,它都会收到退出类型的消息”在这种情况下,“异常”意味着“由于异常”。
    • @Vasil:很高兴知道,我最初并没有那样阅读它。那么在这种情况下,(Java)关闭钩子可能有用吗? stackoverflow.com/questions/261125/…stackoverflow.com/questions/1216172/…
    猜你喜欢
    • 2011-02-14
    • 2010-10-07
    • 2012-09-02
    • 2012-09-03
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多