了解Kafka Stream中的max.task.idle.ms以进行KStream-KTable连接

时间:2019-05-21 18:57:34

标签: apache-kafka apache-kafka-streams

在Kafka 2.2中使用max.task.idle.ms时,我需要帮助来了解Kafka流的行为。

我有一个KStream-KTable联接,其中的KStream已被重新设置密钥:

KStream stream1 = builder.stream("topic1", Consumed.with(myTimeExtractor));
KStream stream2 = builder.stream("topic2", Consumed.with(myTimeExtractor));

KTable table = stream1
       .groupByKey()
       .aggregate(myInitializer, myAggregator, Materialized.as("myStore"))

stream2.selectKey((k,v)->v)
       .through("rekeyedTopic")
       .join(table, myValueJoiner)
       .to("enrichedTopic");

所有主题都有10个分区,为了进行测试,我将max.task.idle.ms设置为2分钟。 myTimeExtractor仅在消息被标记为“快照”时才更新它们的事件时间:stream1中的每个快照消息将其事件时间设置为某个常数T,stream2中的消息将其事件时间设置为T + 1。

当我调用KafkaStreams#start时,topic1和topic2中分别存在200条消息,所有消息均标记为“快照”,此后未添加任何消息。我可以在一秒钟左右的时间内看到myStore和rekeyedTopic都被填满。由于表中消息的事件时间低于流中消息的事件时间,因此我的理解(从读取https://cwiki.apache.org/confluence/display/KAFKA/KIP-353%3A+Improve+Kafka+Streams+Timestamp+Synchronization得出)是,我应该在myStore之后不久看到联接的结果(在richedTopic中)和rekeyedTopic已填满。实际上,我应该能够首先填充rekeyedTopic,并且只要myStore在此之后不足2分钟就被填充,则联接仍将产生预期的结果。

这不会发生。发生的情况是myStore和rekeyedTopic在大约一秒钟内就被填满,然后在2分钟内什么都没有发生,然后RichedTopic才被预期的消息填满。

我不明白为什么在RichedTopic填充之前要有2分钟的停顿,因为一切早已准备就绪。我想念的是什么?

1 个答案:

答案 0 :(得分:0)

根据说明的文档:

  

max.task.idle.ms-流任务在不空闲时将保持空闲状态的最长时间   其所有分区缓冲区均包含记录,以避免潜在的乱序   记录跨多个输入流的处理。

我想说这可能是由于某些分区缓冲区不包含记录,所以它基本上是在等待直到为属性配置的定义时间为止乱序处理。