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

亚历山大街区

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

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

当按需实例化Materializer时,我特别担心资源使用和性能。

斯蒂法诺·博内蒂(Stefano Bonetti)

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")

在我的笔记本电脑上输出

系统创建:901毫秒

实现实现:14毫秒

但是,正如Johan在评论中指出的那样,重要的是要补充实现者的生命周期需要得到适当的管理,shutdown只要它们不再有用就调用,以免浪费资源。

概括地说,尽可能地让物化器四处走动是明智的选择。但是,每当不方便时,它的创建就会很便宜,但要注意将其正确关闭。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该重用一个GSON实例还是按需创建新实例?

我应该在请求中创建executorService还是在Web应用程序中共享一个实例?

我们可以使用相同的 AWS S3 TransferManager 实例,还是应该为每个文件上传创建一个新实例?

我应该创建一个新变量还是始终从类对象访问数据?

我应该为我的所有应用程序创建一个实例还是应该为每个应用程序使用一个实例?

Singleton始终在创建一个新实例

我应该实例化一个新模型吗?

在 Selenium 中,在同一个测试方法中多次重用 Page 类的同一个实例好还是应该创建新实例?

我需要创建一个新列来汇总特定观察发生的实例数量

我应该如何创建一个 Dockerfile 以在一个实例中运行多个服务?

我应该从一个类内部创建一个类实例吗?

我应该总是使用 shared_ptr 来创建一个类实例(而不是新的)吗?

我应该每次创建一个新的Pool对象还是重用一个对象?

我应该扩展服务类还是只使用它的一个实例?

我应该有多个GraphQL实例还是只有一个?

创建一个新的KClass实例

formGroup需要一个FormGroup实例。当我在其他表单组中创建一个表单组时,请传递一个

我可以/应该创建一个只有 1 个实例的 owl/rdfs 类吗

使用Castle Windsor,在启动新范围时需要一个对象的新实例

我应该为每个 WebJob 创建一个单独的 AppicationInsights 实例吗?

我应该创建一个新数组还是使用array.clear?

创建一个我创建的窗口的新实例。被多次叫做不同的事情

我应该如何创建ArrayList的新实例?

如果我的 iOS 应用程序需要公司名称,应该 ia) 转移帐户还是 b) 创建一个新帐户?

使用git时,每次需要修复错误时,是否应该从master创建一个新分支,还是尝试重复使用类似“ my_fix_bug”的分支?

我应该创建一个模型来包含另一个模型实例吗?(姜戈)

我应该使用java.util.Random的全局实例,还是每次使用时都构造一个?

需要一个新的Node模块实例

如何从一个实例中创建一个新的类实例?