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


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

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

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


3422
2018-04-21 18:02


起源



答案:


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

如果您追逐从中开始的通话链 ActorMaterializer.apply (看到 源代码你会发现的 ActorMaterializer (或更好, ActorMaterializerImpl)在创建时没有执行任何重要的事情。

只是为了让你了解它与a的比较 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")

在我的笔记本电脑上输出

系统创建:901毫秒

Materializer创建:14毫秒

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

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


12
2018-04-22 00:22



我认为生命周期和生命周期管理比性能更重要。如果你 shutdown 如果你在一个actor中创建一个物理化器并且当你停止你正在泄漏资源的actor时没有关闭它,那么一个物化器的所有正在运行的流都会突然终止。 - johanandren
绝对同意这一点,无论如何,两种选择中的任何一种都没有大幅度地扭曲表现。 mat.shutdown() 应始终包含在 postStop 你的演员的方法。 - Stefano Bonetti


答案:


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

如果您追逐从中开始的通话链 ActorMaterializer.apply (看到 源代码你会发现的 ActorMaterializer (或更好, ActorMaterializerImpl)在创建时没有执行任何重要的事情。

只是为了让你了解它与a的比较 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")

在我的笔记本电脑上输出

系统创建:901毫秒

Materializer创建:14毫秒

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

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


12
2018-04-22 00:22



我认为生命周期和生命周期管理比性能更重要。如果你 shutdown 如果你在一个actor中创建一个物理化器并且当你停止你正在泄漏资源的actor时没有关闭它,那么一个物化器的所有正在运行的流都会突然终止。 - johanandren
绝对同意这一点,无论如何,两种选择中的任何一种都没有大幅度地扭曲表现。 mat.shutdown() 应始终包含在 postStop 你的演员的方法。 - Stefano Bonetti