java - Akka:创建许多 child Actor 与重用单个 child Actor

标签 java akka actor

我是 Akka 的新手,我有一个(希望如此)简单的问题。我有一个 actor 需要重复执行某个小的子任务——也就是说,每次这个 actor 收到一条消息,它都必须执行 N 个子任务。这个子任务是我指定给 child 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());
        }
    }
}

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

谢谢!

最佳答案

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

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

请参阅引用文档中的顶部示例。 master 创建一组称为 routees 的子 actor,并将它们添加到路由器中:

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

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

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

router.route(msg, getSender());

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

关于java - Akka:创建许多 child Actor 与重用单个 child Actor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28957311/

相关文章:

scala - 了解 NotUsed 和 Done

java - Akka Java OneForOneStrategy 示例未编译

java - Akka Java : dead letters encountered

java - 使用 Java 8 在运行时选择具体实现

java - 我的正则表达式试图修复无效的 SQL 有什么问题?

java - 无法获取每次创建对象时生成的随机数

java - 理解 akka hello-world 示例

swift - Swift 中的 `nonisolated` 关键字是什么?

customization - 我可以自定义 Azure Service Fabric vm 节点吗?

java - 在现有 Spring Boot 应用程序中使用 Camel 和 Jetty Server