Spring Batch - Kafka: KafkaItemReader считывает данные ВСЕГДА с начала - PullRequest
0 голосов
/ 22 января 2020

Я готов использовать Spring Batch для потребления данных Kafka. Эта ссылка spring-tips имеет базовый c пример того же самого.

Вот мой 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-е смещение. Итак, я получаю сообщения с самого начала. Это ошибка?
  • Почему мы должны вручную указывать разделы для чтения? Что это изменит в будущем, не повлияет ли это на мой код?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Каждый раз, когда я запускаю задание, он ищет 0-е смещение. Итак, я получаю сообщения с самого начала. Это ошибка?

Нет, это особенность (серьезно) :-) Выбор способа чтения элементов kafka с начала раздела - сделать его совместимым с другими программами чтения ( все они начинаются с начала источника данных). Но в мире Кафки, где смещение является концепцией первого порядка, мы сделаем начальное смещение настраиваемым (для этого у нас есть PR ). Он будет отправлен в следующем выпуске v4.3 , запланированном на октябрь 2020 года .

Почему нам нужно вручную предоставлять разделы для чтения?

Потому что Spring Batch не может принять решение о том, из какого раздела читать для данного имени topi c. Мы открыты для предложений о разумном дефолте здесь.

0 голосов
/ 22 января 2020

Ответ на 1-й вопрос:

Вы задали enable-auto-commit: false. В этом случае вы должны зафиксировать смещения вручную или установить для enable-auto-commit значение true. В противном случае, поскольку вы не фиксируете смещения, ваше текущее смещение всегда будет равно нулю.

Ответ на второй вопрос:

Вам не нужно вручную предоставлять разделы для читать из. Вы можете просто установить topi c для подписки, тогда Kafka будет равномерно назначать разделы этой topi c для потребителей в той же группе потребителей.

...