Akka:清理动态创建的Actor在完成时是否必要?

2022-09-02 01:44:34

我已经使用Akka及其Java API UntypedActor实现了Actor系统。在其中,一个执行组件(A 类型)使用 按需动态启动其他执行组件(B 类型)。那些B演员会做一些A不再真正关心的计算。但我想知道:当B型演员完成时,是否有必要清理他们?如果是这样,如何?getContext().actorOf(...);

  • 通过让B演员在完成后打电话?getContext().stop(getSelf())
  • 通过让B演员在完成后打电话?[这就是我现在正在使用的]。getSelf().tell(Actors.poisonPill());
  • 什么都不做?
  • 由。。。?

文档对此不清楚,或者我忽略了它。我对Scala有一些基本的了解,但Akka源代码并不完全是入门级的东西......


答案 1

您描述的是每个“请求”(在A的上下文中定义)创建的单一用途的Actor,它们处理一系列事件然后完成,对吧?这绝对没问题,你关闭它们是正确的:如果你不这样做,它们会随着时间的推移而积累,你会遇到内存泄漏。最好的方法是你提到的第一种可能性(最直接),但第二种也是可以的。

一些背景知识:actor在其父级中注册以便识别(例如,在远程处理中需要,但在其他地方也需要),并且此注册可防止它们被垃圾收集。OTOH,每个父级都有权访问它创建的子级,因此没有自动终止(即由Akka)是有意义的,而是需要在用户代码中显式关闭。


答案 2

除了 Roland Kuhn 的回答之外,您可以创建一组共享同一调度程序的预定义执行组件,或者您可以使用将请求分发到执行组件池的路由器,而不是为每个请求创建新的执行组件。

例如,平衡池路由器允许您让一组特定类型的固定执行组件共享同一邮箱:

akka.actor.deployment {
  /parent/router9 {
    router = balancing-pool
    nr-of-instances = 5
  }
}

有关更多详细信息,请阅读有关调度程序路由的文档。


推荐