首页 > 解决方案 > 这是 Akka 角色的正确用例吗?

问题描述

我正在更新一个 Akka 集群,其中特定参与者应该根据配置值在集群内的节点上启动。最初,我考虑使用自定义 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
}

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

为角色键入的 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 角色。

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

标签: javascalakubernetesakkaakka-supervision

解决方案


在 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
}

在 Classic 中,您可以直接通过ActorSystem.


推荐阅读