Akka Streams 是否利用了 Akka Actors?

4
我开始学习Akka Streams,它是一个带有反压功能的处理数据的框架。该库是Akka的一部分,其自我描述为:
Akka是一个工具包和运行时,用于在JVM上构建高度并发、分布式和具有韧性的基于消息驱动的应用程序。
这些能力来自Akka actors的本质。然而,从我的角度来看,流处理和actors之间是不相关的概念。
问题: Akka Streams是否利用了Akka actors的这些特性?如果是,您可以解释一下actors如何帮助streams吗?
2个回答

6

Akka Streams是比Actor更高层次的抽象。它是Reactive Streams的实现,建立在Actor模型之上。它利用了所有Actor的特性。

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


谢谢。我没有注意到 Akka Stream 是建立在 actors 之上的。让我探索这两个类。几天后会选择一个答案。 - suztomo
1
Akka Stream的flow定义了不可变的蓝图,而称为materializations的流程(带参数),将它们作为“高度并发、分布式和弹性的基于消息驱动的”流程在Akka actors之上运行。 - suztomo

5
一份不错的起点是akka流快速入门。是的,一个Actor被用来“实现”每个{SourceFlowSink}的一个Stream,这意味着当你创建一个流时,直到该流被实例化(通常通过.run()方法调用)才会真正发生任何事情。下面是一个定义流的示例:
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,实际上并没有进行任何计算。 流只是一种计算的配方。 要实际启动工作,需要实现流。 这里有一个示例,不使用隐式方法清楚地显示了材料化的过程:
val actorSystem = ActorSystem()
val materializer = ActorMaterializer()(actorSystem)

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

现在至少创建了3个Actor:一个用于Source.single,一个用于Flow.filter,还有一个用于Sink.foreach。请注意:您可以使用相同的materializer来启动其他流。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接