检查远程Akka actor是否可用

时间:2012-05-22 15:38:25

标签: scala akka

如何检查我通过actorFor获得actorRef的远程actor是否还活着?任何对文档的引用都将不胜感激。我正在使用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)
}

我认为我对日志中存在例外情况感到困惑,现在仍然存在。 E.g。

  • 错误:java.net.ConnectException:拒绝连接
  • 错误:java.nio.channels.ClosedChannelException:null

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

2 个答案:

答案 0 :(得分:7)

只需发送消息即可。无论如何,在您发送消息后,它的机器可能会在纳秒内无法访问。如果你没有得到任何答复,很可能已经死了。在文档中有一个很大的章节:http://doc.akka.io/docs/akka/2.0.1/general/message-send-semantics.html

答案 1 :(得分:1)

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

他们是:

  • 超时
  • 重试

如果消息在x段时间后没有出现,则应该“超时”,然后您可以重试该消息。使用超时,您不必担心特定错误 - 只有消息响应失败。对于高级别的可用性,您可能需要考虑使用zookeeper等工具来处理群集/可用性监视。请参阅此处的领导者选举,例如:http://zookeeper.apache.org/doc/trunk/recipes.html