Apache kafka 如何让Kafka Streams每1小时窗口发送一条记录?

Apache kafka 如何让Kafka Streams每1小时窗口发送一条记录?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我正在写一个卡夫卡流应用程序。它执行以下步骤“ 1) 使用输入数据 2) 在1小时窗口内基于新密钥重复删除记录 3) 重新选择键 4) 在1小时窗口内计数钥匙 5) 发送到下游 我是卡夫卡流的新手。我的理解是,为了保持窗口为1小时,我将commit.interval.ms也设置为1小时。这样做正确吗 一旦我使用真实流量部署我的应用程序,它似乎会持续发送消息,而我认为它每小时只会发送一堆消息 感谢您的帮助 我的配置: commit.interval.ms = 3600000 request.tim

我正在写一个卡夫卡流应用程序。它执行以下步骤“ 1) 使用输入数据 2) 在1小时窗口内基于新密钥重复删除记录 3) 重新选择键 4) 在1小时窗口内计数钥匙 5) 发送到下游

我是卡夫卡流的新手。我的理解是,为了保持窗口为1小时,我将
commit.interval.ms
也设置为1小时。这样做正确吗

一旦我使用真实流量部署我的应用程序,它似乎会持续发送消息,而我认为它每小时只会发送一堆消息

感谢您的帮助

我的配置:

commit.interval.ms = 3600000
request.timeout.ms = 600000
retries = 20
retry.backoff.ms = 1000    
cache.max.bytes.buffering = 10485760
  • 我建议您使用最新版本的卡夫卡提供的一次担保。使用它,您不必担心重复信息的消除。
  • 配置生产者配置:特别是buffer.memory和linger.ms。(您还可以检查batch.size)(查看更多信息)
  • 我是卡夫卡流的新手。我的理解是,为了保持窗口为1小时,我将commit.interval.ms也设置为1小时。这样做正确吗

    提交间隔与处理逻辑无关

    您可能需要查看
    suppress()
    运算符。下面的block post可能会有所帮助:


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

    根据您的问题,我认为此链接可能也很有用。这并不是问题的真正答案。编写应用程序j必须重复一个主题,对我来说听起来很重复。这就是为什么我建议只使用一次交付。我同意,第二点没有任何帮助。我将编辑我的答案。问题的问题不是输入中的重复,而是关于Kafka Streams的处理模型的问题,默认情况下,每个风会发出多条记录ow.Hi,如果没有
    suppress()
    ,是否有其他方法可以在每个时间窗口中每个键只发送一条消息?我不知道我的群集是否升级到支持
    suppress()的较新版本
    函数。非常感谢!您可以独立于Kafka群集升级Kafka流。两者都具有向前/向后兼容性:--除此之外,您可以随时编写自定义处理器。感谢Matthias!我尝试了
    抑制
    ,但不断收到大量
    取消订阅所有主题或模式以及分配的分区的消息e> 。我搜索了输出,但没有找到任何好的答案。您是否了解可能的错误?我的代码是
    groupByKey().windowedBy(TimeWindows.of(Duration.ofMinutes(60))).reduce(…).suppress(untilwindcloses(Suppressed.BufferConfig.unbounded())
    非常感谢!!
    取消订阅了所有主题或模式以及分配的分区
    --这应该由还原使用者记录(比较它应该包含的日志行
    -restore
    ,这不应该是一个问题)。您应该做的唯一一件事是指定“宽限期”“在
    时间窗口上
    ——否则,它将默认为24小时,在此之前您不会得到任何结果……谢谢!通过添加“宽限期”,我的应用程序能够生成正确的消息!再问一个问题,
    是否禁止
    将所有内部消息缓存在内存中?还是只保留最新的?由于我需要每秒处理1小时~2k条消息,因此我担心内存使用情况。谢谢
    
    // 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);