我需要确定消息的发件人是否是Akka集群中的本地或远程actor之一。目前,我发现这样做的唯一方法是
def isLocal(sndr: ActorRef) = sndr.path.address.toString == context.system.toString
什么是更好的方法?
我正在使用Akka 2.3
更新 解释为什么我要这样做,以防有办法完全避免这个问题。
在每个节点上,路由器管理许多角色来完成工作。工作者演员将结果发送回本地主演员,并通过发件人参考分配新作业。主演员还定期将结果发送给其他节点的主演员,确保数据在不同节点上的主人之间随机“混合”。对于从远程参与者到达的数据,接收主机不应尝试分配新工作。它本质上是一种混合岛屿方法的实现。
答案 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
作为协议,另一方面,远程演员将有效akka
和hostname/ip
作为协议