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"每个{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 个 Actor:1 个用于 Source.single
,1 个用于 Flow.filter
,1 个用于 Sink.foreach
。注意:您可以使用相同的 materializer
来启动其他流
val doesNothingStream = Source.empty[String]
.to(Sink.ignore)
.run()(materializer)
我开始学习 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"每个{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 个 Actor:1 个用于 Source.single
,1 个用于 Flow.filter
,1 个用于 Sink.foreach
。注意:您可以使用相同的 materializer
来启动其他流
val doesNothingStream = Source.empty[String]
.to(Sink.ignore)
.run()(materializer)