检查远程Akka actor是否可用。

9
我如何检查使用actorFor获得actorRef的远程actor是否正常?我正在使用Scala中的Akka,希望您能提供相关文档。我看到了有关supervisors和deathwatch的内容,但是觉得我的情况并不需要这些重型机器。我只想让客户端使用已知路径检查主节点是否可用,如果可用则发送一条消息进行介绍。如果主节点不可用,则应该等待一会儿然后重试。
更新2: 建议我使用ping-pong ask测试来查看它是否可用。我理解这类似于
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.ClosedChannelException:空

也许这就是它的工作方式,我必须接受日志中的错误/警告而不是试图防止它们?


那么,直接向演员发送“Ping”消息(当然它必须处理它),并等待一段时间收到“Pong”怎么样? - Tomasz Nurkiewicz
好问题,已添加更新。 - Pengin
不,你不应该期望tell/!操作会抛出异常,因为消息的处理是异步进行的。相反,你应该发送一个Ping并等待一段时间来接收Pong。在你的远程actor中只需添加:case _: Ping => sender ! Pong,而在本地actor中则需要使用remoteActor ? Ping - Tomasz Nurkiewicz
2个回答

7

谢谢。我现在明白了。只是对日志中仍然存在错误感到困惑,但也许这是正常的(更新问题)。 - Pengin
是的,Akka会记录所有网络错误。如果您想要忽略这些错误,可以将自己的日志记录器连接到系统中。 - Viktor Klang
维克托,我真的想注册一个自定义处理程序,比如返回消息给发送者。记录大量的垃圾信息,但不让我知道是否出现错误是一种难以欣赏的方案。 - Jed Wesley-Smith
你需要阅读文档:http://doc.akka.io/docs/akka/2.0.2/scala/remoting.html#Remote_Events - Viktor Klang

1
你永远不应该假设网络是可用的。我们这里的架构师总是说,在分布式系统设计中有两个关键概念。它们是:超时和重试。如果消息在x时间段内未成功到达,则应“超时”,然后可以重试该消息。通过超时,您不必担心具体的错误 - 只需知道消息响应失败。对于高可用性,您可能需要考虑使用诸如zookeeper之类的工具来处理集群/可用性监控。例如,请参见此处的领导者选举: http://zookeeper.apache.org/doc/trunk/recipes.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接