使用SpringBoot使用批处理从Kafka读取数据无法正常工作

时间:2019-09-26 09:29:38

标签: java apache-kafka spring-kafka

我使用SpringBoot,并希望使用批处理从Kafka中读取数据。我的application.yml看起来像这样:

spring:
  kafka:
    bootstrap-servers:
      - localhost:9092
    properties:
      schema.registry.url: http://localhost:8081
    consumer:
      auto-offset-reset: earliest
      max-poll-records: 50000
      enable-auto-commit: true
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: io.confluent.kafka.serializers.KafkaAvroDeserializer
      group-id: "batch"
      properties:
        fetch.min.bytes: 1000000
        fetch.max.wait.ms: 20000
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: io.confluent.kafka.serializers.KafkaAvroSerializer
    listener:
      type: batch

我的听众:

@KafkaListener(id = "bar2", topics = "TestTopic")
public void listen(List<ConsumerRecord<String, GenericRecord>> records) {
   log.info("start of batch receive. Size::{}", records.size());
}

在日志中,我看到:

2019-10-04 11:08:19.693  INFO 2123 --- [     bar2-0-C-1] kafka.batch.demo.DemoApplication         : start of batch receive. Size::33279
2019-10-04 11:08:19.746  INFO 2123 --- [     bar2-0-C-1] kafka.batch.demo.DemoApplication         : start of batch receive. Size::33353
2019-10-04 11:08:19.784  INFO 2123 --- [     bar2-0-C-1] kafka.batch.demo.DemoApplication         : start of batch receive. Size::33400
2019-10-04 11:08:19.821  INFO 2123 --- [     bar2-0-C-1] kafka.batch.demo.DemoApplication         : start of batch receive. Size::33556
2019-10-04 11:08:39.859  INFO 2123 --- [     bar2-0-C-1] kafka.batch.demo.DemoApplication         : start of batch receive. Size::16412

我设置了必需的设置:fetch.min.bytesfetch.max.wait.ms,但是它们没有任何效果。

在日志中,我发现在任何设置下,一个包装的大小都不超过33000。我不知所措,我不明白为什么会这样?

1 个答案:

答案 0 :(得分:1)

max.poll.records只是最大值。

还有其他属性会影响您获得多少记录

  • fetch.min.bytes-服务器应为获取请求返回的最小数据量。如果没有足够的数据,则请求将等待该数据积累,然后再回答请求。默认设置为1字节,这意味着只要有一个字节的数据可用,或者提取请求超时等待数据到达,就将对提取请求进行应答。将此值设置为大于1的值将导致服务器等待大量数据累积,从而可以以一些额外的延迟为代价来提高服务器吞吐量。
  • fetch.max.wait.ms-如果没有足够的数据立即满足fetch.min.bytes给出的要求,服务器将在响应提取请求之前阻塞的最长时间。

请参见the documentation

无法精确控制最小记录数(除非它们的长度都相同)。