Like Streams 会利用 Like Actors 吗?

Do Akka Streams leverage Akka Actors?

我开始学习 Akka Streams, which is a framework for processing data with back-pressure functionality. The library is part of Akka,它将自己描述为:

Akka is a toolkit and runtime for building highly concurrent, distributed, and resilient message-driven applications on the JVM.

这些能力来自于 Akka actors 的本质。但是,在我看来,流处理和Actor是互不相关的概念。

问题: Akka Streams 是否利用了 Akka actors 的这些特性?如果是,您能解释一下演员如何帮助直播吗?

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

您甚至可以回到直接在流的任何部分使用演员。查看 ActorPublisher 和 ActorSubscriber。

一个好的起点是 akka stream quickstart

,一个Actor用于"materialize"每个{SourceFlowSink } 的 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 个 Actor:1 个用于 Source.single,1 个用于 Flow.filter,1 个用于 Sink.foreach。注意:您可以使用相同的 materializer 来启动其他流

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