我开始学习Akka Streams,这是一个使用反压功能处理数据的框架。该库是Akka的一部分,它将自己描述为:
Akka是一个用于构建高度并发的工具包和运行时, JVM上的分布式和弹性消息驱动的应用程序。
这些能力来自Akka演员的本质。但是,从我的角度来看,流处理和演员是彼此无关的概念。
问题: Akka Streams是否利用了Akka演员的这些功能?如果是,你会解释演员如何帮助流吗?
答案 0 :(得分:6)
Akka Streams是比演员更高层次的抽象。它是Reactive Streams的一个实现,它构建了actor模型的顶部。它利用了所有actor的功能,因为它使用了actor。
您甚至可以直接在流的任何部分使用actor。看看ActorPublisher和ActorSubscriber。
答案 1 :(得分:2)
一个很好的起点是akka stream quickstart。
是,Actor
用于“实现”Source
的每个{Flow
,Sink
,Stream
} }。这意味着当您创建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)