我目前正在开展一个广泛使用Akka和Akka Streams的项目。
在使用它时,一个问题/问题不断出现:在使用流的所有地方都需要Materializer的最佳实践。特别是当我在一个Actor中,我只能访问ActorSystem时,我应该手动传入一个现有的Materializer实例,还是只在需要时创建一个?
在按需实例化Materializers时,我特别担心资源使用情况和性能。
我目前正在开展一个广泛使用Akka和Akka Streams的项目。
在使用它时,一个问题/问题不断出现:在使用流的所有地方都需要Materializer的最佳实践。特别是当我在一个Actor中,我只能访问ActorSystem时,我应该手动传入一个现有的Materializer实例,还是只在需要时创建一个?
在按需实例化Materializers时,我特别担心资源使用情况和性能。
创造 ActorMaterializer
s相当便宜,并且在大多数情况下合理扩散它们不应成为问题。
如果您追逐从中开始的通话链 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
只要它们不再有用,就要避免资源泄漏。
回顾一下,尽可能通过物化器是一个合理的选择。每当这不方便时,它的创建便宜,但要注意正确关闭它。
创造 ActorMaterializer
s相当便宜,并且在大多数情况下合理扩散它们不应成为问题。
如果您追逐从中开始的通话链 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
只要它们不再有用,就要避免资源泄漏。
回顾一下,尽可能通过物化器是一个合理的选择。每当这不方便时,它的创建便宜,但要注意正确关闭它。