在Akka集群中的Actor查找

时间:2015-11-05 12:42:52

标签: scala akka actor akka-cluster

我有一个Scala应用程序,我有几个节点。每个节点都有一个带有主actor的ActorSystem,每个actor必须有一些ActorRef给某些actor(例如“Node 1”有“Actor3”,“Actor3”需要ActorRef为“Actor7”和“Actor8”才能完成它的工作) 。我的问题是我不知道另一个节点(“Node2”)是否有我正在寻找的“Actor1”或“Actor7”。

我的想法是在每个MemberUp中循环,使用ActorSelection几次并询问每个新成员是否有我正在寻找的actor。这是我能做到的唯一方法吗?有没有更简单,更有效的方法来做这件事?

2 个答案:

答案 0 :(得分:1)

ActorSelection的替代方法可以是查找表。如果你需要做很多演员选择并且演员创作不那么动态,那么它可以是更好的解决方案。

在每个节点上,您可以创建一个数据结构,如Map[String,List[String]]第一个键是节点名称,列表值是此节点中的actor引用。

Trick是当任何节点的actor更改(创建,停止)时,另一个actor应该注意到其他节点有关更改,因此任何节点都已同步更新的地图。

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

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

答案 1 :(得分:1)

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

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

每个名为的actor向其本地Register发送DiscoveryActor,然后Up向所有本地订阅者广播DiscoveryActor其他节点上的所有其他DiscoveryActor,然后广播到订阅者

MemberUp观看MemberDown / DiscoveryActor以确定何时寻找新的同行Down并广播其本地注册或广播<a href="#!/products/productname" 以进行注册击败了同龄人。