这是 Akka 角色的正确用例吗?

Is this a correct use case for an Akka role?

我正在更新一个 Akka 集群,其中一个特定的 actor 应该根据配置值在集群内的一个节点上启动。最初,我考虑使用自定义 Akka 集群角色并做了一些研究,阅读 https://doc.akka.io/docs/akka/current/cluster-usage.html

提供此代码:

      void register(Member member) {
        if (member.hasRole("frontend"))
          getContext()
              .actorSelection(member.address() + "/user/frontend")
              .tell(BACKEND_REGISTRATION, getSelf());
      }

So I could use something like : if (member.hasRole("<MY_CUSTOM_ROLE>")) {
    //Start My Actor
}

根据 actor 的角色启动 actor 似乎不是 Akka classic 中角色的预期功能,因为在上面的示例中没有创建 actor。而是根据路径将消息传递给另一个参与者。由于Akka classic没有spawn方法,所以Akka classic无法实现基于角色创建actor?

为角色键入的 Akka 似乎实现了我正在尝试实现的预期功能:

来自 https://doc.akka.io/docs/akka/current/typed/cluster.html :

Member selfMember = Cluster.get(context.getSystem()).selfMember();

if (selfMember.hasRole("backend")) {
  context.spawn(Backend.create(), "back");
} else if (selfMember.hasRole("front")) {
  context.spawn(Frontend.create(), "front");
}

如果角色可用,这里会创建一个 Akka actor。

因为我使用的是经典 Actors,所以我正在考虑为 .yml 文件中的每个部署添加一个环境变量而不是 Akka“角色”,然后在启动所有 Akka Actor 的源代码中,如果环境变量为给定的部署填充启动给定的参与者,否则不启动参与者。 这是确定应在集群中的每个节点上启动哪个参与者的可行解决方案吗?

在 Akka Classic 中,你会得到类似

的东西
if (member.hasRole("<MY CUSTOM ROLE>")) {
  Props props = ...
  ActorRef ref = context.system().actorOf(props, "special-name") // spawn as a direct child of the ActorSystem
  // or ...
  ActorRef ref = context.actorOf(props, "special-name") // spawn as a child of this actor
}

在经典模式中,您可以通过ActorSystem直接生成。