我目前正在开发一个广泛使用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只要它们不再有用就会调用,以避免资源泄漏.
回顾一下,尽可能通过物化器是一个合理的选择.每当这不方便时,它的创建便宜,但要注意正确关闭它.