Akka Streams - 了解实现的时间和方式

时间:2018-04-24 12:42:05

标签: scala akka akka-stream

我正在开发的应用程序需要/使用户能够在运行时创建和定义任意流。据我所知,尤其是在Akka流中

实现=执行或运行

我的问题

1)流的具体化应该只进行一次吗?即如果它已经实现,那么我可以将该值用于后续运行吗?

2)如上所述,也许我误解了物化这个词。如果必须运行一个流,那么它每次都会实现吗?

我感到困惑,因为在文档中,它说物化实际上创造了流执行所需的资源。所以我的理解是它必须只做一次。就像与数据库的JDBC连接一样。有人可以用非akka术语解释。

1 个答案:

答案 0 :(得分:0)

是的,可以多次实现流。是的,如果一个流多次运行,它每次都会实现。来自documentation

  

由于流可以多次实现,因此每个这样的实现也将重新计算实现值,通常导致每次返回不同的值。在下面的示例中,我们创建了我们在runnable变量中描述的流的两个正在运行的物化实例,并且即使我们使用了相同的{{1},这两个实现也为我们提供了与地图不同的Future引用未来:

sink

将流视为可重复使用的蓝图,可以多次运行/实现。物化器需要具体化,Akka Streams提供了一个名为// connect the Source to the Sink, obtaining a RunnableGraph val sink = Sink.fold[Int, Int](0)(_ + _) val runnable: RunnableGraph[Future[Int]] = Source(1 to 10).toMat(sink)(Keep.right) // get the materialized value of the FoldSink val sum1: Future[Int] = runnable.run() val sum2: Future[Int] = runnable.run() // sum1 and sum2 are different Futures! 的物化器。物料化器分配必要的资源(演员等)并执行流。虽然通常对不同的流和多个实现使用相同的物理化器,但流的每个实现都会触发运行流所需的资源分配。在上面的示例中,ActorMaterializersum1使用相同的蓝图(sum2)和相同的材质大小,但它们是产生不同资源分配的不同实现的结果。