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