如何正确查询kafka流状态存储?

时间:2019-12-30 11:40:13

标签: apache-kafka kafka-consumer-api apache-kafka-streams

一个月前,我用20个流线程构建了一个kafka-streams应用程序。这个应用程式会计算固定时间间隔内不同人的消费量。最近我发现从当地国营商店查询的人们的花钱少于真实的钱。我已阅读官方文件以及可以找到的任何其他文件,但尚未找到解决方法。

我使用的是Kafka版本0.11.0.3,kafka服务器的版本为0.11.0.3,kafka流api也是0.11.0.3。只有一个具有20个流线程的应用程序。

一些重要信息:

Kafka流配置:
  • 复制因子3
  • num.stream.threads 20
  • commit.interval.ms 1000
  • partition.assignment.strategy StickyAssignor.class.getName()
  • fetch.max.wait.ms 500
  • 最大民意测验记录5000
  • 最长轮询间隔300000
  • heartbeat.interval.ms 3000
  • session.timeout.ms 30000
  • auto.offset.reset最新
kafka消息结构
  • 键=人的名字
  • 价值=他花的钱
  • 时间=创建此消息的当前时间
Kafka流构建代码:
KStreamBuilder kStreamBuilder = new KStreamBuilder();
KStream<String, Double> peopleSpendStream = kStreamBuilder.stream(topic);
peopleSpendStream.groupByKey()// group by people's name
        .aggregate(() -> new HashMap<String, Double>(8192),
                (key, value, aggregate) -> {
                    aggregate.merge(key, value, Double::sum);
                    return aggregate;
                },
                TimeWindows.of(ONE_MINUTE).until(ONE_HOUR * 10), // 1-min window, keep 9 hours
                new HashMapSerde<>(), // serialize and deserialize by jackson actually
                PEOPLE_SPEND_STORE_NAME);
查询代码:
long time = System.currentTimeMilles();
for (String name : names) { // query by people's name
    try (WindowStoreIterator<HashMap<String, Double>> iterator = store.fetch(name, time - TEN_MINUTE_MILLES, time)) {
        iterator.forEachRemaining(kv -> log.info("name = {}, time = {}, cost = {}", name, kv.key, kv.value));
    }
}

我有什么不对吗?我特别需要您的帮助。

0 个答案:

没有答案