检索Akka演员或创建它(如果不存在)

ric*_*din 5 java scala actor akka

我正在开发一个应用程序,该应用程序创建一些Akka actor来管理和处理来自Kafka主题的消息。具有相同密钥的消息由同一参与者处理。我还使用消息键来命名相应的演员。

当从该主题中读取新消息时,我不知道id是否等于消息密钥的actor是否已经由actor系统创建。因此,我尝试使用其名称来解析actor,如果尚不存在,则创建它。我需要在参与者解决方面管理并发性。因此,可能有多个客户询问参与者系统是否存在参与者。

我现在使用的代码如下:

private CompletableFuture<ActorRef> getActor(String uuid) {
    return system.actorSelection(String.format("/user/%s", uuid))
                 .resolveOne(Duration.ofMillis(1000))
                 .toCompletableFuture()
                 .exceptionally(ex -> 
                     system.actorOf(Props.create(MyActor.class, uuid), uuid))
                 .exceptionally(ex -> {
                     try {
                         return system.actorSelection(String.format("/user/%s",uuid)).resolveOne(Duration.ofMillis(1000)).toCompletableFuture().get();
                     } catch (InterruptedException | ExecutionException e) {
                         throw new RuntimeException(e);
                     }
                 });
}
Run Code Online (Sandbox Code Playgroud)

上面的代码未经过优化,可以使异常处理更好。

但是,在Akka中,是否存在一种更惯用的方式来解决演员,或者如果演员不存在则创建演员?我想念什么吗?

Jef*_*ung 4

ActorRef考虑创建一个参与者,将消息 ID 到s的映射作为其状态进行维护。这个“接待员”参与者将处理所有请求以获取消息处理参与者。当接待员收到对参与者的请求(该请求将包括消息 ID)时,它会尝试在其映射中查找关联的参与者:如果找到这样的参与者,则将其返回ActorRef给发送者;否则,它会创建一个新的处理参与者,将该参与者添加到其映射中,并将该参与者引用返回给发送者。

  • 在这种情况下,请查看 Akka 集群。它实际上做了同样的事情,但是参与者通过您定义的某种策略跨多个分区进行分片。消息使用分区策略路由到特定分区,然后分区将它们定向到正确的参与者。如果演员不存在,则会被创建。如果您的数百万参与者需要的话,这还可以让您跨多个节点进行扩展。 (4认同)