【问题标题】:Spring Batch - Kafka: KafkaItemReader reads the data ALWAYS from beginningSpring Batch - Kafka:KafkaItemReader 总是从头开始读取数据
【发布时间】:2020-05-08 06:12:14
【问题描述】:

我愿意使用 Spring Batch 进行 Kafka 数据消费。这个spring-tips 链接有一个相同的基本示例。

这是我的reader

  @Bean
  KafkaItemReader<String, String> kafkaItemReader() {
    var props = new Properties();
    props.putAll(this.properties.buildConsumerProperties());

    return new KafkaItemReaderBuilder<String, String>()
        .partitions(0)
        .consumerProperties(props)
        .name("customers-reader")
        .saveState(true)
        .topic("test-consumer")
        .build();
  }

我的application.properties 文件:

 spring:
    kafka:
      consumer:
        bootstrap-servers: localhost:9092
        group-id: groupid-Dev
        enable-auto-commit: false
        auto-offset-reset: latest
        auto.commit.interval.ms: 1000
        key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        value-deserializer: org.apache.kafka.common.serialization.StringDeserialize

问题:

  • 每次我启动作业时,它都会寻找第 0 个偏移量。所以,我从一开始就收到消息。这是一个错误吗?
  • 为什么我们需要手动提供要读取的分区?以后有什么变化,不会影响我的代码吗?

【问题讨论】:

  • 未指定偏移量
  • 不重启Kafka服务器也会出现这种情况吗?

标签: java spring apache-kafka spring-batch spring-kafka


【解决方案1】:

每次我启动一项工作时,它都会寻找第 0 个偏移量。所以,我从一开始就收到消息。这是一个错误吗?

不,这是一个特性(严重):-) 选择让 kafka 项目阅读器从分区开头读取是为了使其与其他阅读器保持一致(它们都从数据源的开头开始)。但是在 Kafka 的世界中,偏移量是一阶概念,我们将使起始偏移量可配置(为此我们有一个 PR)。这将在即将发布的 v4.3 planned for October 2020 中提供。

为什么我们需要手动提供要读取的分区?

因为 Spring Batch 无法决定从哪个分区读取给定主题名称。我们愿意在此处就合理的默认设置提出建议。

【讨论】:

    【解决方案2】:

    第一个问题的答案:

    你设置了enable-auto-commit: false。在这种情况下,您必须手动提交偏移量,或者您可以将 enable-auto-commit 设置为 true。否则因为您不提交偏移量,您当前的偏移量将始终为零。

    回答第二个问题:

    您不必手动提供要读取的分区。你可以设置订阅主题,然后Kafka会将该主题的分区平均分配给同一个消费者组中的消费者。

    【讨论】:

    • 第一个问题:我尝试过 true,但没有奏效。那么,如果我不向 KafkaItemReaderBuilder 提供分区,那么它应该可以工作吗?我想知道。可能 cz 然后它会订阅主题。
    • 不,spring 断言至少提供 1 个分区。所以这是行不通的。
    • @AdiV 这些是关于 Kafka 的基本概念。但是我对spring-kafka并不熟悉,所以我不知道如何将这些与spring-kafka一起应用。很抱歉没有帮到你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多