我对 Akka 很陌生,我有一个(希望)简单的问题。我有一个 Actor 需要重复执行某个小子任务 - 也就是说,每次该 Actor 收到一条消息时,它都必须执行 N 个子任务。这个子任务是我指定给儿童演员的。我的问题是,我应该为每个子任务创建一个新的子演员实例吗?或者我应该简单地生成一个子演员,并向其发送 N 条消息?在这种情况下,最佳做法是什么?
为了更好地说明我的问题,这里有两个简单的示例(在 Java 中 - 但希望对 Scala 人员来说足够简单!):
第一个 actor 类在构造时创建一个子 actor,然后向该单个子 actor 发送许多消息。
public class ParentActor extends UntypedActor {
private final ActorRef childActor;
public ParentActor() {
this.childActor = getContext().actorOf(Props.create(childActor.class));
}
@Override
public void onReceive(Object msg) {
for (int i=0; i<1000; i++) {
this.childActor.tell("Some message", getSelf());
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,将其与以下 Actor 进行比较,后者为每条需要发送的消息生成一个新的子 Actor。
public class ParentActor extends UntypedActor {
@Override
public void onReceive(Object msg) {
for (int i=0; i<1000; i++) {
final ActorRef childActor = getContext().actorOf(Props.create(childActor.class));
childActor.tell("Some message", getSelf());
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
可以使用Routers在 akka 中将工作分配给 actor 。
这个想法是将子 rsp 工作参与者的选择移动到消息流中。
请参阅引用文档中的顶部示例。主节点创建一组称为“routees”的子参与者,并将它们添加到路由器中:
router = new Router(new RoundRobinRoutingLogic(), routees);
Run Code Online (Sandbox Code Playgroud)
路由器可以配置为使用一组不同的路由逻辑实现,这里是一个简单的循环逻辑。
当一条消息发送到其中一个子参与者时,您可以将其发送到路由器,它负责选择正确的子参与者并将其发送到那里:
router.route(msg, getSender());
Run Code Online (Sandbox Code Playgroud)
getSender 可用于传递消息发送者,以防消息最初在工作程序中收到,或者您只需传递“getSelf()”的结果(或者可能什么都没有,不确定)来直接发送它。