Akka Streams是否会利用Akka Actors?

时间:2015-07-31 05:07:13

标签: scala akka actor akka-stream

我开始学习Akka Streams,这是一个使用反压功能处理数据的框架。该库是Akka的一部分,它将自己描述为:

  

Akka是一个用于构建高度并发的工具包和运行时,   JVM上的分布式和弹性消息驱动的应用程序。

这些能力来自Akka演员的本质。但是,从我的角度来看,流处理和演员是彼此无关的概念。

问题: Akka Streams是否利用了Akka演员的这些功能?如果是,你会解释演员如何帮助流吗?

2 个答案:

答案 0 :(得分:6)

Akka Streams是比演员更高层次的抽象。它是Reactive Streams的一个实现,它构建了actor模型的顶部。它利用了所有actor的功能,因为它使用了actor。

您甚至可以直接在流的任何部分使用actor。看看ActorPublisher和ActorSubscriber。

答案 1 :(得分:2)

一个很好的起点是akka stream quickstart

Actor用于“实现”Source的每个{FlowSinkStream} }。这意味着当您创建Stream时,实际上没有任何实际情况发生,直到实现流,通常是通过.run()方法调用。

例如,这里定义了一个Stream:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Flow, Sink}

val stream = Source.single[String]("test")
                   .via(Flow[String].filter(_.size > 0))
                   .to(Sink.foreach{println})

即使流现在是val,也没有实际发生过任何计算。 Stream只是一个计算方法。要真正启动工作,Stream需要实现。下面是一个不使用含义来清楚地显示实现方式的示例:

val actorSystem = ActorSystem()
val materializer = ActorMaterializer()(actorSystem)

stream.run()(materializer)  //work begins

现在已经创建了3个演员(至少):Source.single为1,Flow.filter为1,Sink.foreach为1。注意:您可以使用相同的materializer启动其他流

val doesNothingStream = Source.empty[String]
                              .to(Sink.ignore)
                              .run()(materializer)