2012-05-22 44 views
9

如何检查一个远程演员是否已通过actorFor获取actorRef?任何参考文件将不胜感激。我使用Scala的Akka。检查远程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.ClosedChannelException:空

也许这就是它是如何工作的,我必须接受错误/在日志中发出警告,而不是试图防止它们发生?

+0

那么简单地向演员发送Ping消息(当然它必须处理它)并等待'Pong'一段时间呢? –

+0

好问题,已添加更新。 – Pengin

+0

不,你不应该期待'tell' /'!'操作抛出一个异常,因为消息的处理是异步发生的。相反,你应该发一个'Ping'和**等待**给'Pong'一段时间。在你的远程演员中只需添加:'case _:Ping =>发件人! Pong'和本地的:'remoteActor? Ping' –

回答

7

只需发送消息。无论如何,您的邮件发送之后,其机器可能无法到达纳秒。如果你没有得到任何答复,那很可能是死的。在这篇文档中有一个很大的章节:http://doc.akka.io/docs/akka/2.0.1/general/message-send-semantics.html

+0

谢谢。我想我现在明白了。只是混淆了日志中仍然存在错误,但也许这是正常的(更新问题)。 – Pengin

+0

是的,Akka记录所有网络错误。如果你愿意,你可以连线你自己的记录器来忽略这些记录器。 –

+0

Viktor,我真的很想注册一个自定义处理程序,比如说将一条消息返回给发件人。记录大量的垃圾,但不让我知道有一个错误是难以欣赏的方案。 –

1

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

它们是:

  • 超时
  • 重试

消息应该“超时”,如果他们不让它的时间x时间后,然后您可以重试的消息。有了超时,你不必担心具体的错误 - 只有该消息响应失败。要获得高级别的可用性,您可能需要考虑使用诸如zookeeper之类的工具来处理群集/可用性监视。在这里看到领导者选举例如:http://zookeeper.apache.org/doc/trunk/recipes.html