【问题标题】:Check if actor exists in akka cluster检查akka集群中是否存在actor
【发布时间】:2018-07-02 01:54:17
【问题描述】:

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

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

def getOrCreate(customerId: String, deviceId: String): Future[ActorRef] = {
    context.system.actorSelection(s"/user/${customerId}{$deviceId}") ?识别(deviceId)映射{
    case ActorIdentity(`deviceId`, None) =>
      // 创建新的演员
    case ActorIdentity(`deviceId`, Some(actor)) =>
      演员
  }
}

当actor存在于本地节点时,上面的代码可以正常工作,为了检查actor是否存在于集群中的另一个节点上,我必须执行以下操作:

def getOrCreate(customerId: String, deviceId: String): Future[ActorRef] = {
    context.system.actorSelection(s"akka.tcp://Relay@node1:3503/user/${customerId}{$deviceId}") ?识别(deviceId)映射{
    case ActorIdentity(`deviceId`, None) =>
      // 创建新的演员
    case ActorIdentity(`deviceId`, Some(actor)) =>
      演员
  }
}



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

【问题讨论】:

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


    【解决方案1】:

    您似乎只想在集群中不存在具有相同标识符的参与者时才创建一个参与者实例。为此,我认为最好的方法是使用 Akka cluster sharding 并让 Akka 负责创建和分发实例。 这还将负责将任何消息路由到正确的节点,在集群大小发生变化时重新分配参与者等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 2019-01-01
      • 2019-04-29
      • 1970-01-01
      • 2013-08-03
      • 2012-01-04
      • 2011-05-17
      相关资源
      最近更新 更多