使用Akka Streams流式传输过去和未来的数据

时间:2017-02-08 20:45:36

标签: reactive-programming akka-stream

我试图在下面的例子中理解更好的Akka Streams概念。考虑一个银行账户。它有一个过去的交易历史记录,将会有新的交易。现在我们想将它用作Akka流的源。但其数据将用于3种不同的场景:

  1. 消费者应用程序收集所有过去的交易并打印报告。
  2. 消费者应用程序是一个事务监视器,它从应用程序启动时开始打印所有新事务。
  3. 消费者应用程序结合了(1)和(2)的功能:它首先打印所有过去的交易,然后打印所有到达的交易。
  4. 我们在Akka流方面有什么?流源中的差异是否会以不同的数据提供相同的流量和汇点?或者来源是相同的(它是来自同一银行账户的所有交易)但我们需要应用不同的过滤操作来获得不同的结果?

1 个答案:

答案 0 :(得分:2)

Akka流源可以像scala中存在的任何其他Iterable一样进行组合。

根据您的示例,假设我们有持久存储在数据库中的历史事务。我们可以使用slick streaming之类的东西来从db获取这些事务:

val historicSource : Source[Transaction, _] = ???

还会有实时交易(可能来自消息系统):

val realtimeSource : Source[Transaction, _] = ???

这两个来源可以合并:

val combinedSource = historicSource ++ realtimeSource

然后,这些组合事件可以由相同的流处理逻辑使用;例如,你可以println任何超过$ 1,000.00的交易:

val isLargeTransaction = (_ : Transaction).dollarAmount > 1000.0

val reportTransaction = (transaction : Transaction) =>
  println s"Large Transaction: $transaction"

combinedSource.filter(isLargeTransaction)
              .runWith(Sink foreach reportTransaction)