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

Akka键入:如何让演员推荐给当地演员?

华凡
2023-03-14

我正在将现有应用程序从Akka Classic移植到Akka Typed。最初,您可以使用上下文获取对参与者的引用。actorSelection()。resolveOne()

我知道在Akka Type中不再支持这一点,我们应该使用Receptionist来注册演员以供ServiceKey发现。

但是,我只想将消息发送到本地参与者,即存在于集群中每个节点上的本地单例。我有它的本地路径,但没有对它的直接引用。这是因为它是由Akka管理系统创建的健康检查参与者。

从文档中可以看出,向接待员注册一个参与者以获得服务密钥,这使得集群的所有成员都可以使用该服务密钥。因此,如果我查询服务键,我将在所有节点上收到对单例参与者的引用。

似乎没有一种方法可以仅在本地注册Receptionist,并且在集群中发布这些内部引用似乎不必要地泄漏并且违反了封装。从Receptionist返回列表中找出哪个ref是本地参与者似乎也不容易。我想用于注册的ServiceKey可能是系统特定的?

我错过了一个明显的解决方案吗?

共有1个答案

翟新
2023-03-14

在Akka管理参与者的特殊情况下,由于该项目不依赖于Akka类型(因此所涉及的参与者是典型的参与者),您可以将键入的ActorContext视为经典的ActorContext,并使用ActorSelection。

从您的问题来看,我猜Java(在Scala中,隐式使其不那么冗长,也许可以澄清意图):

akka.actor.typed.javadsl.Adapter.toClassic(context).actorSelection(path).resolveOne(timeout)

对于只想要解析类型化本地参与者的情况,我发现最有效的策略是将解析功能合并到创建ActorSystem时提供的行为中。想要被找到的参与者将向ActorSystem注册,其他参与者可以向ActorSystem询问ActorRef

这里的一个微妙之处是context.getSystem()为您提供了一个ActorSystem

// Might not actually be syntactically valid Java, but hopefully the fix to make it
// legal is obvious...
ActorRef<MyActorSystemCommand> systemRef = context.getSystem().unsafeUpcast<MyActorSystemCommand>()

请注意,正确获取ActorSystem的消息类型非常重要:如果ActorSystem的行为不接受该类型的消息,则在发送消息时,actor系统将崩溃(据我所知,无法阻止actor系统关闭)。

这种方法的一个演变是定义一个仅本地的接待员参与者,该参与者在ActorSystem启动时产生:希望与该接待员交互的参与者通过上述方法获得其ActorRef,然后该参与者处理解决方案

当然,请注意,在这两种方法中(与集群感知的Receptionist一样),只有明确选择加入这样解决的参与者才是可解决的。这与Akka Type的基本主题一致:让参与者更多地负责它向外界暴露的程度。

 类似资料:
  • 我很想知道调整大小,或者在本例中增加单个节点系统上的actor池中actor的数量是否真的会影响性能。 我有一个带超线程的四核系统。在任何给定的点上,系统可以运行8个线程。假设执行元执行的大多数操作都是CPU绑定的,那么将池中的执行元数量从20个增加到40个会有什么收获呢?

  • 我有一个单身演员的等级制度。父母监督和协调孩子。当重新启动协调器时,我需要保持子角色运行。有没有一种方法可以防止子角色在其父角色重新启动时重新启动,或者我应该重新考虑我的角色层次结构?我一直在研究akka的监管策略,但找不到明确的答案。

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

  • 我想创建可以从文件系统中为资源服务的参与者。理想情况下,[1]我希望每个目录和每个文件都有一个参与者。但是我不想创建整个actor树层次结构,因为我希望尽可能节省内存和资源。 据我所知,只有当它的父级存在时,才能创建一个演员。懒洋洋地创建这些层次结构的最佳方法是什么。是否有一个钩子可以用来捕捉失败并在飞行中创建参与者层次结构,并有效地这样做? 这样,我就可以向参与者发送、、、...消息,从而使ak

  • 我从这里得到上面的错误消息: 特别是从第二行。。进口是 akka版本是2.2.1,scala是2.10.2,我正在使用sbt 0.13来构建它。 编辑:我用 结果如下: