从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
中产生的会话的集合作为汇总值?