【问题标题】:Do Akka Streams leverage Akka Actors?Akka Streams 是否利用 Akka Actors?
【发布时间】:2015-07-31 05:07:13
【问题描述】:

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

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

这些能力来自 Akka actor 的天性。但是,在我看来,流处理和演员是互不相干的概念。

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

【问题讨论】:

    标签: scala akka actor akka-stream


    【解决方案1】:

    Akka Streams 是比 actor 更高级别的抽象。它是一种反应式流的实现,它建立在在演员模型之上。它利用了所有的 actor 功能,因为它使用了 actor。

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

    【讨论】:

    • 谢谢。我没有注意到 Akka Stream 是建立在演员之上的。让我探索这两个类。几天后会选择一个答案。
    • Akka 流 flow 定义了不可变的蓝图,并且称为 materializations 的过程(带有参数)将它们作为“高度并发、分布式和弹性Akka actor 之上的“消息驱动”流。
    【解决方案2】:

    一个好的起点是akka stream quickstart

    是的Actor 用于“实现”Stream 中的每个 {SourceFlowSink}。这意味着,当您创建 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)
    

    【讨论】:

      猜你喜欢
      • 2019-04-19
      • 2019-04-13
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2020-05-31
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多