9

如何检查我通过actorFor获得actorRef的远程演员是否还活着?任何对文档的引用将不胜感激。我正在使用来自 Scala 的 Akka。

我见过对主管和死亡守望者的引用,但并不觉得我的用例需要这么重的机器。我只想让我的客户检查主人是否使用已知路径启动,以及它是否正在发送一条自我介绍的消息。如果主服务器没有启动,那么它应该等待一段时间然后重试。

更新 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:null

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

4

2 回答 2

7

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

于 2012-05-22T21:35:10.800 回答
1

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

他们是:

  • 超时
  • 重试

如果消息在 x 时间段后仍未发送,则消息应该“超时”,然后您可以重试消息。使用超时,您不必担心特定的错误 - 只有消息响应失败。为了获得高水平的可用性,您可能需要考虑使用诸如 zookeeper 之类的工具来处理集群/可用性监控。请参阅此处的领导人选举,例如:http: //zookeeper.apache.org/doc/trunk/recipes.html

于 2013-08-01T15:43:34.757 回答