Kafka Streams检测丢失的记录

时间:2019-01-04 10:10:26

标签: apache-kafka apache-kafka-streams

我正在通过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时,无论我们在同一会话中拥有哪个其他元素,都将始终完成。 有任何想法吗?

1 个答案:

答案 0 :(得分:1)

使用Processor API可以轻松完成一些代码。 DSL可以与Processor API混合使用。

处理看起来像这样。

  1. 构建状态存储并使用StreamsBuilder::addStateStore
  2. 添加它
  3. 创建KStream并使用Transformer调用KStream::transform函数,完成全部工作
  4. 如果会话为 DEAD Done
  5. ,则转换结果将是带有信息的消息
  6. 使用Transformer,您将实现如何处理每条消息。对于每个消息,您必须更新keyValue Store,其中key是会话ID。您必须保存有关会话的最后一条消息的时间戳
  7. 然后在Punctuator(定期调用)中,检查哪个会话为TIMEOUT,并使用状态为{DONE,DEAD}的ProcessorContext::forward传递信息

整个代码的操作方法,您可以找到here