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

Dec*_*coy 6 java actor akka

我对 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)

谢谢!

cyb*_*bye 5

可以使用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()”的结果(或者可能什么都没有,不确定)来直接发送它。