同步 LIKE actor 最佳实践

Synchronised AKKA actor best practice

我有以下需求

我需要完成一项重大任务

Actor A:执行主要任务,如果消息是'special'则将其传递给actor B进行处理,然后完成任务 Actor B : 执行主要任务的特殊逻辑任务,A 和 B 一起完成这个 A

实施

public static class ActorA extends UntypedActor {


  public void onReceive(Object message) {
    if (message instanceof Work) {
     // if message is special 
ActorRef actorB = this.getContext().actorOf(Props.create(ActorB.class,));
                actorB.tell(new specialTask(message.property), getSelf());

    } else {
      unhandled(message);
    }
  }
}

演员乙

 public static class ActorB extends UntypedActor {


      public void onReceive(Object message) {
        if (message instanceof specialTask) {
       //do special task using the message that does not change the state of the message

        } else {
          unhandled(message);
        }
      }
    }

ActorA 不依赖于 actor B 任务的完成。但是我不确定在完成时是否应该没有消息在演员 B 之间传递给 A。这是正确的做法吗?

据我了解,您只想使用 Actor B 来计算不应在 A 中计算的内容。在这种情况下,如果 A 不依赖于 B 创建的结果,您就不会当计算完成时,确实需要从 B 向 A 发送消息。您可以对 B 中的计算结果做任何您想做的事情(写入磁盘,post 到另一个服务等)。

然而,使用 Akka 模式作为 Work Pulling or a Reactive Stream 是一种很好的做法,不会让来自 A 的消息溢出您的 actor B 邮箱。主要想法是让 Actor B 请求任务。

另外需要考虑的是,如果B做任何I/O/heavy work/blocking强烈建议把这个actor放到运行中分开dispatcher,否则可以关闭整个系统。