Akka:创建多个子actor vs.重用单个子actor

6
我对Akka比较新,有一个(希望很简单)的问题。我有一个需要重复执行某个小子任务的Actor;也就是说,每次这个Actor收到一条消息,它都需要执行N个子任务。我已经将这个子任务分配给了一个子Actor。我的问题是:对于这些子任务,我应该为每个子任务创建一个新的子Actor实例呢?还是只需生成单个子Actor,然后向其发送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());
        }
    }
}

现在,将其与以下演员进行比较,该演员为需要发送的每个消息生成一个新的子演员。
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());
        }
    }
}

谢谢!


1
这将取决于子任务的类型。对于单个孩子,所有任务将按顺序处理,可能会导致总持续时间更长。对于多个孩子,所有任务将并行处理,没有保证顺序。您还应考虑一条消息无法处理的影响。监督策略应该是什么?其余任务是否应正常处理? - Michael Lang
1个回答

5
使用路由器(Routers)可以在Akka中分配工作给Actor。
这个想法是将子节点rsp工作者的选择移到消息流程中。
请查看参考文档中的顶部示例。主进程创建一组名为路由器(routees)的子Actor,并将它们添加到路由器中:
router = new Router(new RoundRobinRoutingLogic(), routees);

路由器可以配置为使用一组不同的路由逻辑实现,这里使用简单的轮询逻辑。
当向其中一个子Actor发送消息时,您只需将其发送到路由器,它会负责选择正确的子Actor并将消息发送到那里。
router.route(msg, getSender());

如果消息最初是在worker中接收到的,getSender可以用来传递消息发送者;或者您可以直接传递“getSelf()”的结果(或者什么都不传递,不确定)来发送它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接