Kafka Stream聚合器 - 如何在发送消息之前设置在聚合中等待的时间?

时间:2018-02-01 13:47:22

标签: apache-kafka apache-kafka-streams

我的Kafka Streams聚合读取了一个紧凑的主题并执行此操作:

(0_10, ..)(0_11, ..) ---> (0, [10]) (0, [10, 11])

我想知道如何控制聚合时间窗口,因此它不会为每个传入消息发送消息,而是等待并聚合其中的一些消息。 Imagine Stream App会消耗这些消息:

  • (0_10, ..)
  • (1_11, ..)
  • (0_13, ..)

如果前3个消息在短时间内到达,我希望看到:

  • <击> (0,[10])
  • (0, [10, 13])
  • (1, [11])

我无法弄清楚,在吐出新值之前,如何告诉我的Kafka Stream应用程序等待更多聚合需要多长时间。

我的代码很简单

builder
    .table(keySerde, valueSerde, sourceTopic)
    .groupBy(StreamBuilder::groupByMapper)
    .aggregate(
        StreamBuilder::aggregateInitializer,
        StreamBuilder::aggregateAdder,
        StreamBuilder::aggregateSubtractor)
    .to(...);

目前,它有时会批量聚合,但不确定如何调整它:

{"Aggregate":[100]}
{"Aggregate":[100,300,301,302]}
{"Aggregate":[100,300,301,302,404]}

1 个答案:

答案 0 :(得分:5)

  

我想知道如何控制聚合时间窗口,因此它不会为每个传入的消息发送消息,而是等待并聚合其中的一些消息。

Kafka Streams&#39;这是不可能的。窗口。一般来说,Kafka Streams窗户不会关闭&#34;或者&#34;结束&#34;从某种意义上说,一旦窗口关闭,你就无法告诉它产生最终的结果&#34; (没有这样的概念)。这是为了适应迟到的结果。当消息到达聚合窗口时,您将看到更新。 Kafka Streams吐出更新的频率取决于缓存(见下文)。有关详情,请参阅:How to send final kafka-streams aggregation result of a time windowed KTable?

  

目前,它有时会批量聚合,但不确定如何调整它:

您在那里看到的最有可能是在KTables的商店中缓存的结果。 KTables仅在更改日志刷新并提交其偏移量时转发下游消息。这是为了在需要恢复状态时保持一致性。如果你改变你的Kafka Streams&#39;应用程序的提交间隔将减少您的缓存刷新频率,因此您将看到从KTable转发的更新更少(更改日志,聚合等)。但那与窗口无关。

尽管如此,如果您想要对更改日志流进行窗口化聚合,可以使用KTable将其从KStream转换为KTable#toStream()。然后,您可以在聚合步骤中指定窗口。