我应该共享Materializer实例还是在需要时始终创建一个新实例?

Ale*_*ock 12 akka akka-stream

我目前正在开发一个广泛使用Akka和Akka Streams的项目.

在使用它时,一个问题/问题不断出现:在使用流的所有地方都需要Materializer的最佳实践.特别是当我在一个Actor里面,我只能访问ActorSystem时,我应该手动传入一个现有的Materializer实例,还是只在需要时创建一个?

在按需实例化Materializers时,我特别担心资源使用情况和性能.

Ste*_*tti 14

ActorMaterializers 的创建相当便宜,并且在大多数情况下合理扩散它们不应成为问题.

如果你追逐从ActorMaterializer.apply(参见源代码)开始的调用链,你会发现ActorMaterializer(或者更好ActorMaterializerImpl)在创建时没有执行任何重要的操作.

只是为了让您了解它与ActorSystem创建的比较,请考虑以下代码

  val sysStart = System.nanoTime()
  val actorSystem = ActorSystem("mySystem")
  val sysDuration = FiniteDuration(System.nanoTime() - sysStart, TimeUnit.NANOSECONDS)
  println(s"System creation: ${sysDuration.toMillis} ms")

  val matStart = System.nanoTime()
  val materializer = ActorMaterializer()(actorSystem)
  val matDuration = FiniteDuration(System.nanoTime() - matStart, TimeUnit.NANOSECONDS)
  println(s"Materializer creation: ${matDuration.toMillis} ms")
Run Code Online (Sandbox Code Playgroud)

在我的笔记本电脑上输出

系统创建:901毫秒

Materializer创建:14毫秒

但是,正如Johan在评论中指出的那样,重要的是要补充说,物化者的生命周期需要妥善管理,shutdown只要它们不再有用就会调用,以避免资源泄漏.

回顾一下,尽可能通过物化器是一个合理的选择.每当这不方便时,它的创建便宜,但要注意正确关闭它.