测试演员发件人是本地还是远程

时间:2014-01-22 09:25:39

标签: akka akka-cluster

我需要确定消息的发件人是否是Akka集群中的本地或远程actor之一。目前,我发现这样做的唯一方法是

def isLocal(sndr: ActorRef) = sndr.path.address.toString == context.system.toString

什么是更好的方法?

我正在使用Akka 2.3

更新 解释为什么我要这样做,以防有办法完全避免这个问题。

在每个节点上,路由器管理许多角色来完成工作。工作者演员将结果发送回本地主演员,并通过发件人参考分配新作业。主演员还定期将结果发送给其他节点的主演员,确保数据在不同节点上的主人之间随机“混合”。对于从远程参与者到达的数据,接收主机不应尝试分配新工作。它本质上是一种混合岛屿方法的实现。

2 个答案:

答案 0 :(得分:2)

您可以通过ActorSystem获取Extension的远程地址(请参阅Programmatically obtain ephemeral port with Akka)。这样你可以比较地址而不是字符串,而不是hacky。

解决Ryan的观点,另一种方法是将结果消息包装在另一条消息中。当您在包装器上匹配时,您将知道它不是来自本地工作人员,然后您可以打开它并对结果做任何您需要做的事情。

def receive = {
  case NonLocalResults(results) => // do something with non-local results
  case Results(...)             => // do something with local results
  ...
}

答案 1 :(得分:1)

您还可以查看Sender的{​​{1}}和host。本地演员将protocol作为主持人,empty作为协议,另一方面,远程演员将有效akkahostname/ip作为协议