我目前正在从事一个广泛使用Akka和Akka Streams的项目。
使用它时,一个问题/问题不断出现:在所有使用流的地方都需要Materializer的最佳实践是什么。尤其是当我只能在Actor系统中访问Actor时,我应该手动传递现有的Materializer实例还是在需要时创建一个实例?
当按需实例化Materializer时,我特别担心资源使用和性能。
ActorMaterializer
s的创建相当便宜,并且在大多数情况下将其合理扩散应该不是问题。
如果您从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")
在我的笔记本电脑上输出
系统创建:901毫秒
实现实现:14毫秒
但是,正如Johan在评论中指出的那样,重要的是要补充实现者的生命周期需要得到适当的管理,shutdown
只要它们不再有用就调用,以免浪费资源。
概括地说,尽可能地让物化器四处走动是明智的选择。但是,每当不方便时,它的创建就会很便宜,但要注意将其正确关闭。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句