在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分钟的停顿,因为一切早已准备就绪。我想念的是什么?
答案 0 :(得分:0)
根据说明的文档:
max.task.idle.ms-流任务在不空闲时将保持空闲状态的最长时间 其所有分区缓冲区均包含记录,以避免潜在的乱序 记录跨多个输入流的处理。
我想说这可能是由于某些分区缓冲区不包含记录,所以它基本上是在等待直到为属性配置的定义时间为止乱序处理。