我有一个Scala应用程序,我有几个节点。每个节点都有一个带有主actor的ActorSystem,每个actor必须有一些ActorRef给某些actor(例如“Node 1”有“Actor3”,“Actor3”需要ActorRef为“Actor7”和“Actor8”才能完成它的工作) 。我的问题是我不知道另一个节点(“Node2”)是否有我正在寻找的“Actor1”或“Actor7”。
我的想法是在每个MemberUp中循环,使用ActorSelection几次并询问每个新成员是否有我正在寻找的actor。这是我能做到的唯一方法吗?有没有更简单,更有效的方法来做这件事?
答案 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"
以进行注册击败了同龄人。