同步 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,否则可以关闭整个系统。
我有以下需求
我需要完成一项重大任务
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,否则可以关闭整个系统。