如何发现Scala远程演员死了?

Mar*_*sco 8 scala fault-tolerance exit remote-actors actor

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

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

Vas*_*iuk 4

但是,当远程参与者以不太优雅的方式终止时会发生什么(例如,运行它的虚拟机崩溃了)

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

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

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

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

您可以在一组参与者前面放置一种轮询负载均衡器/调度程序,它只会使用那些活着并准备好处理消息的参与者(这在远程参与者可能突然出现/消失的情况下是有意义的)代理) -> Scala actor 可以同时处理多个消息吗?