Scala 检查远程Akka actor是否可用

Scala 检查远程Akka actor是否可用,scala,akka,Scala,Akka,如何检查通过actorFor获得actorRef的远程参与者是否还活着?如有任何文件参考,将不胜感激。我用的是Scala的Akka 我已经看到了对主管和死亡守卫的引用,但我真的不觉得我的用例需要这么重的机器。我只想让我的客户机检查主机是否正在使用已知路径,以及它是否正在发送自我介绍的消息。如果主机未启动,则应等待一段时间,然后重试 更新2: 建议我用乒乓球测试看看它是否还活着。我知道这有点像 implicit val timeout = Timeout(5 seconds) val future

如何检查通过actorFor获得actorRef的远程参与者是否还活着?如有任何文件参考,将不胜感激。我用的是Scala的Akka

我已经看到了对主管和死亡守卫的引用,但我真的不觉得我的用例需要这么重的机器。我只想让我的客户机检查主机是否正在使用已知路径,以及它是否正在发送自我介绍的消息。如果主机未启动,则应等待一段时间,然后重试

更新2: 建议我用乒乓球测试看看它是否还活着。我知道这有点像

implicit val timeout = Timeout(5 seconds)
val future = actor ? AreYouAlive
try{
    Await.result(future, timeout.duration)
}catch{
    case e:AskTimeoutException => println("It's not there: "+e)
}
我想我已经被日志中存在的异常弄糊涂了,这些异常现在仍然存在。例如

  • 错误:java.net.ConnectException:连接被拒绝
  • 错误:java.nio.channels.ClosedChannel异常:null

也许这就是它的工作原理,我必须接受日志中的错误/警告,而不是试图保护它们?

只发送消息。不管怎样,在你发送信息后的纳秒内,它的机器可能无法访问。如果你没有得到任何回复,它很可能已经死了。文档中有一个关于这一点的大章节:

你不应该假设网络是可用的。我们这里的架构师总是说在分布式系统设计中有两个关键概念

它们是:

  • 超时
  • 重试

如果消息在x个时间段后仍无法发送,则消息应“超时”,然后您可以重试该消息。使用timeout,您不必担心特定的错误,只需消息响应失败即可。对于高可用性级别,您可能需要考虑使用像ZooKeKER这样的工具来处理群集/可用性监视。请参见此处的领导人选举示例:

简单地向参与者发送
Ping
消息(当然它必须处理)并等待
Pong
一段时间如何?好问题,添加了更新。不,您不应该期望
告诉
/
引发异常的操作,因为消息的处理是异步进行的。相反,您应该发送一个
Ping
并等待
Pong
一段时间。在您的远程参与者中,只需添加:
case\uu:Ping=>sender!Pong
和本地一台:
remoteActor?Ping
谢谢。我想我现在明白了。只是对日志中仍然存在错误感到困惑,但这可能是正常的(更新的问题)。是的,Akka记录所有网络错误。如果你愿意的话,你可以用你自己的记录器来忽略这些。维克多,我真的想注册一个自定义处理程序,比如说一个将消息返回给发送者的处理程序。记录大量垃圾但不让我知道有错误是一个很难理解的方案。您需要阅读文档: