Akka:创建许多儿童演员与重用单个儿童演员

Akka: Creating many child actors vs. reusing a single child actor

我对 Akka 很陌生,我有一个(希望如此)简单的问题。我有一个 actor 需要重复执行某个小的子任务——也就是说,每次这个 actor 收到一条消息,它都必须执行 N 个子任务。这个子任务是我指定给儿童演员的。我的问题是,我应该为这些子任务中的每一个创建一个新的子演员实例吗?或者我应该简单地生成一个子演员,然后向它发送 N 条消息?在这种情况下,最佳做法是什么?

为了更好地说明我的问题,这里有两个简化的示例(在 Java 中 - 但希望对 Scala 人来说足够简单!):

第一个 actor class 在构造时创建了一个子 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());
        }
    }
}

现在,将它与下面的 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());
        }
    }
}

谢谢!

可以使用 Routers 在 akka 中将工作分配给 actor。

想法是将子 rsp worker actor 的选择移动到消息流中。

请参阅参考文档中的顶部示例。主人创建一组子演员,称为路由并将它们添加到路由器:

router = new Router(new RoundRobinRoutingLogic(), routees);

路由器可以配置为使用一组不同的路由逻辑实现,这里是简单的循环逻辑。

当一条消息被发送到其中一个子 actor 时,您可以将它发送到路由器,它负责选择正确的子 actor 并将其发送到那里:

router.route(msg, getSender());

getSender 可用于传递消息发送者,以防消息最初在 worker 中接收,或者您只需传递 'getSelf()' 的结果(或者可能什么都没有,不确定)以直接发送它.