检查akka集群中是否存在actor

时间:2018-01-23 09:39:11

标签: scala akka actor akka-cluster akka-actor

我遇到了一个场景,我需要检查是否存在特定的actor,这可以通过ActorSystem.actorSelection方法通过指定actor路径来完成。

但是,当本地节点上存在此类actor时,此方法可正常工作。如果actor-system由多个节点组成,并且actor存在于另一个节点上,则此方法告知actor不存在。如果我给出指定远程actor系统的字符串,则此方法有效。但是,在actorSelection方法中指定远程actor-system字符串似乎不是一个好主意,因为集群中的节点可以加入和离开。

def getOrCreate(customerId: String, deviceId: String): Future[ActorRef] = {
    context.system.actorSelection(s"/user/${customerId}{$deviceId}") ? Identify(deviceId) map {
    case ActorIdentity(`deviceId`, None) =>
      // create new actor
    case ActorIdentity(`deviceId`, Some(actor)) =>
      actor
  }
}

上面的代码在本地节点上存在actor时工作正常,为了检查actor是否存在于集群中的某个另一个节点上,我必须做类似的事情:

def getOrCreate(customerId: String, deviceId: String): Future[ActorRef] = {
    context.system.actorSelection(s"akka.tcp://Relay@node1:3503/user/${customerId}{$deviceId}") ? Identify(deviceId) map {
    case ActorIdentity(`deviceId`, None) =>
      // create new actor
    case ActorIdentity(`deviceId`, Some(actor)) =>
      actor
  }
}



有没有更好的检查方法是整个akka-cluster中存在actor而不仅仅是本地节点?

1 个答案:

答案 0 :(得分:2)

看起来您只想在群集中不存在具有相同标识符的actor时才创建actor实例。为此,我认为最好的方法是使用Akka cluster sharding并让Akka负责创建和分发实例。 这也将负责将任何消息路由到actor到正确的节点,如果群集大小改变等,则重新分配actor。