如何在Akka Streams中对事件进行会话/分组?

时间:2018-03-12 10:28:43

标签: akka-stream reactive-streams akka-kafka

要求是我想写一个Akka流媒体应用程序,它监听来自Kafka的连续事件,然后根据每个事件中嵌入的一些id值,在一个时间范围内对事件数据进行会话化。

例如,让我们说我的时间范围窗口是两分钟,在前两分钟我得到以下四个事件:

输入:

{"message-domain":"1234","id":1,"aaa":"bbb"}
{"message-domain":"1234","id":2,"aaa":"bbb"}
{"message-domain":"5678","id":4,"aaa":"bbb"}
{"message-domain":"1234","id":3,"aaa":"bbb"}

然后在输出中,在对这些事件进行分组/会话后,我将根据其消息域值只有两个事件。

输出:

{"message-domain":"1234",messsages:[{"id":1,"aaa":"bbb"},{"id":2,"aaa":"bbb"},{"id":4,"aaa":"bbb"}]}
{"message-domain":"5678",messsages:[{"id":3,"aaa":"bbb"}]}

我希望这是实时发生的。有关如何实现这一目标的任何建议吗?

1 个答案:

答案 0 :(得分:0)

要在时间窗口内对事件进行分组,您可以使用Flow.groupedWithin

val maxCount : Int = Int.MaxValue

val timeWindow = FiniteDuration(2L, TimeUnit.MINUTES)

val timeWindowFlow : Flow[String, Seq[String]] =
  Flow[String] groupedWithin (maxCount, timeWindow)