当前位置: 首页 > 知识库问答 >
问题:

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

田柏
2023-03-14

我对阿克卡很陌生,我有一个(希望)简单的问题。我有一个参与者需要重复执行某个小的子任务——也就是说,每次这个参与者收到消息时,它都必须执行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());
        }
    }
}

现在,将它与下面的参与者进行比较,后者为需要发送的每个消息生成一个新的子参与者。

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个答案

单于海荣
2023-03-14

将工作分配给演员可以在akka中使用路由器完成。

其思想是将子rsp工作者参与者的选择移动到消息流中。

参见参考文档中的顶部示例。主节点创建一组称为routees的子角色,并将它们添加到路由器:

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

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

当消息发送到其中一个子角色时,您只需将其发送到路由器,路由器将负责选择正确的子角色并将其发送到那里:

router.route(msg, getSender());

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

 类似资料:
  • 让我们假设一个使用Akka Typed实现的应用程序有一个持久执行元。这个持久执行元作为其操作的一部分创建了瞬态(或非持久)子执行元,每个子执行元都有一个唯一的ID,这些ID是持久状态的一部分。持久执行元还需要一些与其子级通信的方式,但我们不希望持久化子级的,因为它们实际上不是状态的一部分。在恢复时,持久参与者应该基于恢复的状态重新创建它的子级。这听起来并不像是一个很不寻常的用例,我正在试图弄清楚

  • 我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者

  • 我是Akka的新手,我想知道我应该如何处理将工作委托给其他(儿童)演员的演员,但在哪里: 其中一些儿童演员必须按特定顺序参与;和 其中一些子参与者可以以任何顺序参与,并且可以真正地与主/父参与者所做的事情异步执行 假设我有以下儿童演员(不管他们做什么): 假设我有以下调用它们的父参与者: 如你所见: 必须首先“参与”(由家长调用),我们必须等待家长的响应,然后才能继续参与/调用、或 换句话说,当消

  • 我有父母和孩子。每个儿童演员控制一个装置。当我创建所有的子角色时,我给他们一个uuid。 每个子参与者都是通过设备配置创建的,当配置更改时,我希望通过以下方式重新创建参与者: > 停止旧的: 最终的未来停止了=优雅的停止(actorRef,Duration.create(1,时间单位。秒)); Await.result(停止,Duration.create(1, TimeUnit.二)); 重新创

  • 我正在学习Akka类型的Actor库,并尝试使用。但是它返回一个类型,而不是我最初创建的子参与者的类型- 我所做的解决方法是在创建时将子对象简单地存储在hashmap中。但这不是一个可伸缩的。 我该如何实现这一点?尤其是在分布式场景下?

  • 示范喷洒服务(路线): Redis执行元(Mock还没有实际的Redis客户端)