Kafka Streams:如何从一个会议中生成多个会话?

时间:2018-10-18 17:01:33

标签: session apache-kafka apache-kafka-streams stream-processing

从KafkaStreams中的综合浏览量主题按会话进行窗口化,聚合逻辑可能会将一个会话(由SessionWindows对象的键和时间定义,我们将其称为 kSessions )分成一个或多个“会话”(根据您的业务逻辑定义为综合浏览量,我们称它们为会话)。 这里的kSession-breaker逻辑示例可能是基于时间的,例如“午夜前的切割会话”,但可能还有其他基于逻辑的(例如接收某个会话中断事件,例如订单)。

您要跟踪将这些会话发送给下游主题的会话,并保持与其他事件(例如综合浏览量)的关系。

如何在Kafka Streams中以健康的方式对此建模?

示例代码:

val sessionWindows = SessionWindows.`with`(TimeUnit.MINUTES.toMillis(30)).until(TimeUnit.DAYS.toMillis(360))
val pageviewWindowStream : SessionWindowedKStream[Key, Value] = topic.
  groupBy((k,v) => new Key(k.a, v.b) ).
  windowedBy(sessionWindows)

val sessionStore : KTable[Windowed[Key], List[AggValue]] = pageviewWindowStream.aggregate(List.empty[AggValue])(
  aggregator = (key: Key, value: Value, aggregator: AggValue) => { ...aggregator code },
  merger = (k, aggValue1, aggValue2) => { ...merger code } )

注意:在此问题中,kSession中的会话逻辑将与其他会话互斥。

因此,我可以将AggValue定义为List[Session]。但是然后,当从其queryableStoreName查询其存储时,如果我向聚合器值查询fetch(k, t),我将获得从给定值派生的整个会话集(这将是一个列表[会话]`,我将不得不通过它们来完成相应的会话。

我曾考虑使用.toStream().flatMapValues(... flatmap the sessionsList ... )之类的东西,但看不到办法。

是否有解决此问题的方法,或者您是否要在每千次会话基础上进行汇总,并保留kSession中产生的会话的集合作为汇总值?

0 个答案:

没有答案