2015-11-05 90 views
1

我有一个Scala应用程序,其中有几个节点。每个节点都有一个带有主角色的ActorSystem,每个角色必须对某些角色有一些ActorRef(例如,“节点1”具有“角色3”,“角色3”需要角色角色“角色7”和“角色8”来完成其工作) 。我的问题是,我不知道另一个节点(“Node2”)是否有我正在寻找的“Actor1”或“Actor7”。Akka集群中的演员查询

我的想法是每个MemberUp内循环,使用ActorSelection数次,并要求每一个新成员,如果有我要找的演员。这是我能做到的唯一方法吗?有没有更简单,更有效的方法来做这件事?

+0

如果我没有误解你,为什么不使用akka集群单例? 集群辛格尔顿 - 阿卡文档 http://doc.akka.io/docs/akka/snapshot/scala/cluster-singleton.html,你可以按住'地图[地址,列表[ActorRef]'喜欢法提赫·麦兹说或者使用该单身人员使用远程路由器产生童工 – mingchuno

回答

1

的另一种方法ActorSelection可以是查找表。如果你需要做很多演员选择,演员的创作不那么动感,那可能是更好的解决方案。

上,您可以创建一个像Map[String,List[String]]第一密钥的数据结构中的每个节点为节点名称和目录值是在此节点演员裁判。

技巧是当任何节点具有其行为改变(创建,停止)的另一位演员应该注意到的变化,因此任何节点都同步更新的地图的其他节点。

如果你保证,那么每个节点都可以查找演员的存在;

map.get(nodeName) match { 
    case Some(n) => n.contains(actorName) 
    case None => false 
} 
+0

但是在MemberUp中,我只能访问“成员”参数,并且它有点受限。我不太清楚如何处理这张地图。 –

+0

那么你会怎么做actorsselection?您需要有远程选择的标识符。我认为你可以发送消息给节点{id}/commandActor。 CommandActor处理映射操作,每个节点创建它。 –

+0

我知道我需要演员的名字,这样的想法是在MemberUp使用下面的行:'context.system.actorSelection(RootActorPath(member.address)/“用户”/actorName);只是' –

1

我已经通过在每个节点上已知路径有DiscoveryActor解决了我们的集群中的非常类似的问题。该DiscoveryActor的协议有

Register(name, actorRef) 
Subscribe(name) 
Up(name, actorRef) 
Down(name, actorRef) 

每个命名为演员发送Register到其本地DiscoveryActor这反过来广播Up所有当地用户和其他节点上的所有其他DiscoveryActor的,这反过来又广播到他们的用户

DiscoveryActor手表MemberUp/MemberDown来确定何时寻找一个新的对等DiscoveryActor,并广播其本地注册或广播Down注册击落同行。