将 ActorRef 获取到先前生成的 EventSourcedBehavior

Get ActorRef to previously spawned EventSourcedBehavior

我们通过扩展 EventSourcedBehavior 将事件源与 Akka Persistence 结合使用。当我们创建持久性 actor 时,我们通过使用 uuid 给它一个唯一的名称(我们在 create 中使用相同的名称来构建 PersistenceId,用于实体分片):

UUID uuid = UUID.randomUUID();
String name = MyBehavior.nameFor(uuid);

ActorRef<Command> actorRef =
    context.spawn(MyBehavior.create(uuid), name);

稍后,当我们想向 actor 发送更多命令时,我们希望从上下文中获取 ActorRef<Command>,因为 spawn 返回的 actorRef 对象引用将不再在范围内。将命令视为后续 HTTP 请求的结果。

我们不能使用 context.getChild(name) 因为它 returns ActorRef<Void>.

我们也考虑过 Receptionist 的 actor discovery,但是文档说它不能扩展到任意数量的 actor:

https://doc.akka.io/docs/akka/current/typed/actor-discovery.html#receptionist-scalability

另一方面,类型不支持 ActorSelection,如下 link:

https://doc.akka.io/docs/akka/current/typed/from-classic.html#actorselection

我们不确定此处的正确方法。任何帮助将不胜感激。

如果我对您的问题的理解正确,您想要访问之前生成的 actor 的 ActorRef。这是我通常做的。

private final Map<String, ActorRef<Command> instanceIdToActor = new HashMap<>();

private ActorRef<Command> getActorRef(String instanceId) {
  ActorRef<Command> instanceActor = instanceIdToActor.get(instanceId);
  if (instanceActor == null) {
    instanceActor = getContext().spawn(MyBehavior.create(), instanceId);
    instanceIdToActor.put(instanceId, instanceActor);
  }

  return instanceActor;
}

您还必须在演员死亡时删除引用。

instanceIdToActor.remove(instanceId);

终于在文档上找到了。在类型化系统中,处理持久性 actor 的正确方法是使用 EntityRefClusterSharding,如以下链接的示例所示: https://doc.akka.io/docs/akka/current/typed/cluster-sharding.html#persistence-example