我正在通过Kafka Streams 2.10构建流式应用程序,并且遇到了一个概念性的问题。
The producer1 sends (Key -> Value): Session1 -> RUNNING
The producer2 sends (Key -> Value): Sessionabc -> RUNNING
The producer1 sends (Key -> Value): Session1 -> DONE
现在,我想检测到会话中断。我正在尝试使用SessionWindow,但是由于Kafka逐条记录地计算记录,因此无法一次计算全部。
这是我的摘录:
builder
.stream("topic", Consumed.with(serdeKeySessionEvent, serdeValueSessionEvent))
.groupByKey(Grouped.with(serdeKeySessionEvent, serdeValueSessionEvent))
.windowedBy(SessionWindows.with(SESSION_DURATION))
.reduce(new SessionReducer())
.toStream((windowed, value) -> windowed.key())
.filter((k,v)-> Objects.nonNull(v) && v.getStatus() == Status.RUNNING)
.peek((a,b)->System.out.println("This Value is missing: \n "+a.toString()+b.toString()));`
注意:精简器仅确保当我们看到DONE时,无论我们在同一会话中拥有哪个其他元素,都将始终完成。 有任何想法吗?
答案 0 :(得分:1)
使用Processor API可以轻松完成一些代码。 DSL可以与Processor API混合使用。
处理看起来像这样。
StreamsBuilder::addStateStore
KStream::transform
函数,完成全部工作ProcessorContext::forward
传递信息整个代码的操作方法,您可以找到here