我正在编写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);
答案 0 :(得分:2)
我是Kafka Streams的新手。我的理解是,为了将窗口保持为1 hr,我还将commit.interval.ms设置为1 hr。这是正确的做法吗?
提交间隔与您的处理逻辑无关。
您可能希望研究suppress()
运算符。另外,以下阻止帖子可能会有所帮助:
Kafka Streams的处理模型是连续的,默认情况下它会发送连续的结果更新。这就是为什么每个输入消息只得到一条输出消息的原因,因为处理输入消息会修改结果。
答案 1 :(得分:-1)