与Akka相比,Akka流中的并行性

时间:2018-11-16 06:36:48

标签: akka akka-stream

我一直在尝试探索更多关于akka流的信息,但是我未能理解我们如何以使用Akka的方式来实现类似的并行性,比如说Actor A消耗了kafka的数据并将其写入s3和另一个Actor B从kafka消费并将其写入postgres,另一个Actor C从DB读取并为其生成另一个kafka主题。所有3个参与者可以处于不同的参与者系统中,而不必依赖于其他参与者。但是,如何使用Akka流实现类似的目标。我相信akka流在阶段中A会做一些事情并将其通过管道传送到B,依此类推,直到到达水槽为止。我确实意识到有一个mapAsync可以用来并行化事物,但是我不确定它在这种情况下以及在订购gaurantees方面将如何发挥作用。

1 个答案:

答案 0 :(得分:0)

单一来源

对于您列出的特定用例,您可以使用BroadcastHub将每个数据项从kafka“散布”到您列出的每个Sink值:

type Data = ???

val kafkaSource : Source[Data, _] = ???

val runnableGraph: RunnableGraph[Source[Data, NotUsed]] =
  kafkaSource.toMat(BroadcastHub.sink(bufferSize = 256))(Keep.right)

val kafkaHub : Source[Data, NotUsed] = runnableGraph.run()

val s3Sink : Sink[Data, _] = ???

val postgresSink : Sink[Data, _] = ???

kafkaHub.to(s3Sink).run()
kafkaHub.to(postgresSink).run()

多个来源

上述实现的一个重要缺点是“生产者的价格将自动适应最慢的消费者”。

因此,如果您能够与最终源建立多个连接,则可以通过最大化并发性来提高性能:

val kafkaSource : () => Source[Data,_] = ???

//stream 1
kafkaSource().to(s3Sink).run()

//stream 2
kafkaSource().to(postgresSink).run()