【问题标题】:Is this a correct use case for an Akka role?这是 Akka 角色的正确用例吗?
【发布时间】:2021-06-05 20:16:55
【问题描述】:

我正在更新一个 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
}

根据角色启动一个actor似乎不是Akka经典中角色的预期功能,因为在上面的示例中没有创建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,我正在考虑为 .yml 文件中的每个部署添加一个环境变量而不是 Akka“角色”,然后在启动所有 Akka Actor 的源代码中(如果填充了环境变量)对于给定的部署,启动给定的actor,否则不启动actor。 这是确定应该在集群中的每个节点上启动哪个参与者的可行解决方案吗?

【问题讨论】:

    标签: java scala kubernetes akka akka-supervision


    【解决方案1】:

    在 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 生成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2015-06-07
      • 1970-01-01
      • 2017-01-29
      • 2020-01-17
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多