压缩的chagelog主题是否为Kafka Streams中的每个窗口都包含一个键?

时间:2019-07-29 15:46:07

标签: apache-kafka streaming apache-kafka-streams

据我了解,用于窗口聚合的更改日志主题应为每个窗口至少包含一个键/值?

input
  .groupByKey() // group by user
  .windowedBy(
    TimeWindows
      .of(Duration.ofSeconds(60))
      .advanceBy(Duration.ofSeconds(10))
      .grace(Duration.ofSeconds(60)))
  .aggregate(
    () -> new Aggregate(config),
    (userId, msg, aggregate) -> aggregate.addAndReturn(msg),
    Materialized
      .<String, Aggregate>as(inMemoryWindowStore(
        config.getOutputStore(),
        Duration.ofSeconds(300),
        Duration.ofSeconds(60),
        false))
      .withCachingDisabled()
      .withKeySerde(Serdes.String())
      .withValueSerde(new MyCustomSerde()));

查询状态存储时,我希望为每个窗口获取一个键/值:

WindowStoreIterator<Aggregate> iter = store.fetch(userId, start, end)

但是我什么也没得到(迭代器为空),或者有时它少于开始到结束之间的实际窗口数。

1 个答案:

答案 0 :(得分:0)

您错误地使用了store.fetch(key, startTs, endTs)的参数。两个时间戳startTsendTs的确不是不是,是指单个窗口的开始/结束时间戳,但这是一个时间范围:{{1} }将返回所有包含时间范围内的开始时间戳的窗口。

老版本的JavaDocs不太好看,可能会导致误导。较新的版本改进了JavaDocs:https://kafka.apache.org/23/javadoc/org/apache/kafka/streams/state/ReadOnlyWindowStore.html

请注意,参数类型已更改并在较新版本中重命名:

fetch()