scala - 在 akka 中手动创建 Actor 层次结构

标签 scala akka actor

我的应用程序需要能够创建 Actor 的树结构。我想这样做的标准方法是将实例化代码放在 Actor 中,以便他们可以实例化他们的 child 。我更喜欢的方法是能够在给定的路径上实例化一个actor。比如在mySystem中创建actor A,然后可以直接创建akka://mySystem/A/B等actor。是否存在这样的功能?它会大大简化我的代码。

编辑:既然我不在手机上,让我详细说明一下。

说我有一个类

class myActor extends actor

我需要制作这些的 n 路树。而不是使用类似的代码在接收函数中实例化他们自己的 child
case Create(n:Int) => {}

我希望通过不包含任何代码来简化 myActor 代码,而是能够在代码的开头手动创建我的层次结构。所以理想情况下是这样的(假设假设静态函数“创建”):
val sys = ActorSystem("mySystem")
Akka.Actors.Create("akka://mySystem/a", new myActor())
Akka.Actors.Create("akka://mySystem/a/b", new myActor())
Akka.Actors.Create("akka://mySystem/a/c", new myActor())

这将创建 Actor 树:
  a
 / \
b   c

现在,这是否存在?有没有更好的方法来做到这一点,而不会用实例化代码弄乱我的 Actor 代码?

编辑,第 2 轮:

好的,看起来这个功能不存在。相反,我创建了一个 actor 的子特性,并强制将我所有的实例化代码放在那里,以便我的具体实现类仍然整洁。

最佳答案

您的问题始于对解决方案的假设,不幸的是,它不包括对问题的描述。

Actor 树首先被理解为监督层次结构:父级处理其子级的失败,父级的生命周期对其子级的生命周期设置界限。一个 Actor 是否应该是另一个 Actor 的 child 需要通过考虑这些影响来确定。

我这么说是因为您的问题暗示您正在根据其他一些标准对监督树进行建模,很可能将其作为注册表滥用 system.actorFor作为查找机制。可能在极少数情况下可行,但先验我不会推荐它;我宁愿在调度程序actor中放置一个哈希映射,并让它处理查找。如果您通过测量得出结论,它的性能不够好,您可以使用 router 来放大它。 .

现在回答你的问题:每个父级都需要创建自己的子级,这意味着它必须以某种方式包含代码来做到这一点。您可以通过Props向下层次结构使其部分可配置,但您不应该解决 what supervision means ;问问自己,如果其中一个叶子失败了会发生什么,然后问问自己,当中间角色重新启动时,您假定的叶子是否应该重新启动和/或终止。

关于scala - 在 akka 中手动创建 Actor 层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14289440/

相关文章:

scala - Scala默认参数和null

scala - Play 框架 2.0 Controller /异步究竟是如何工作的?

scala - 如何终止 Scala Remote Actor 客户端?

UML 用例图 2 个参与者与 1 个用例相关联

scala - 如果抛出异常,Akka Actor 不会终止

scala - 通过 Shapeless 获取默认案例类参数

scala - 在 Scala 中使用惰性 val 的性能损失是什么,但在 def 中

scala - 在 Scala IDE 中运行简单的 Spark 代码

akka - 在 Akka 中等待多个结果

scala - 如何匹配但不消耗 Akka HTTP 中的路径前缀?