如何让Kafka Streams每1小时窗口为每个键发送一条记录?

时间:2019-07-01 18:19:29

标签: apache-kafka apache-kafka-streams

我正在编写Kafka Streams应用程序。它执行以下步骤” 1)消耗输入数据 2)在1小时内根据新密钥对记录进行重复数据删除 3)重新选择键 4)在1小时窗口内计数键 5)发送到下游。

我是Kafka Streams的新手。我的理解是,为了将窗口保持为1小时,我也将commit.interval.ms设置为1小时。这是正确的做法吗?

一旦我以真正的流量部署应用程序,似乎该应用程序一直在发送消息,而我认为它每小时只会发送一堆消息?

感谢您的帮助!!

我的配置:

commit.interval.ms = 3600000
request.timeout.ms = 600000
retries = 20
retry.backoff.ms = 1000    
cache.max.bytes.buffering = 10485760

// dedupe by new key per window(1hr)
 stream = inputStream
        .selectKey(... )
        .groupByKey()
        .windowedBy(TimeWindows.of(TimeUnit.MINUTES.toMillis(60)))
        // only keep the latest event for each customized key
        .reduce((event1, event2) -> event2)
        .toStream()
        .groupByKey()
        .windowedBy(TimeWindows.of(TimeUnit.MINUTES.toMillis(60)))
        .reduce((event1, event2) -> {
            long count1 = event1.getCount();
            long count2 = event2.getCount();
            event2.setCount(count1 + count2);
            return event2;
        })
        .toStream()
        .to(OUTPUT_TOPIC);

2 个答案:

答案 0 :(得分:2)

  

我是Kafka Streams的新手。我的理解是,为了将窗口保持为1 hr,我还将commit.interval.ms设置为1 hr。这是正确的做法吗?

提交间隔与您的处理逻辑无关。

您可能希望研究suppress()运算符。另外,以下阻止帖子可能会有所帮助:

Kafka Streams的处理模型是连续的,默认情况下它会发送连续的结果更新。这就是为什么每个输入消息只得到一条输出消息的原因,因为处理输入消息会修改结果。

答案 1 :(得分:-1)

  1. 我建议您使用最新版本的kafka提供的完全保证。使用它,您不必担心重复删除邮件。 https://www.baeldung.com/kafka-exactly-once
  2. 配置生产者配置:特别是buffer.memory和linger.ms。 (您也可以检查batch.size)(有关更多信息,请检查https://kafka.apache.org/documentation/#producerconfigs