4

我需要确定消息的发送者是 Akka 集群中的本地参与者还是远程参与者之一。目前我发现这样做的唯一方法是

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

有什么更好的方法?

我正在使用 Akka 2.3

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

在每个节点上,路由器管理许多参与者来完成工作。工作角色将结果发送回本地主角色,并通过发送者引用分配新作业。Master Actor 还定期向其他节点的 Master Actor 发送结果,确保数据在不同节点的 Master 之间随机“混合”。在数据来自远程参与者的情况下,接收主机不应该尝试分配新工作。它本质上是一个带有混合的岛方法的实现。

4

2 回答 2

2

您可以ActorSystem通过 an获取远程地址Extension(请参阅使用 Akka 以编程方式获取临时端口)。这样你就可以比较地址而不是字符串,少一些hacky。

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

def receive = {
  case NonLocalResults(results) => // do something with non-local results
  case Results(...)             => // do something with local results
  ...
}
于 2014-01-22T22:08:38.387 回答
1

您也可以检查Sender'shostprotocol. 本地参与者将拥有empty主机并akka作为协议,另一方面,远程参与者将拥有有效的协议hostname/ipakka.tcp作为协议

于 2017-03-15T23:41:00.510 回答