【问题标题】:How a kafka consumer with @KafkaListener annotation handles max.poll.records带有 @KafkaListener 注释的 kafka 消费者如何处理 max.poll.records
【发布时间】:2020-06-06 06:00:14
【问题描述】:

我正在使用 spring boot 2.1.7.RELEASE 和 spring-kafka 2.2.7.RELEASE。并且我正在使用 @KafkaListener 注释来创建消费者,并且我正在使用消费者的所有默认设置。

根据 apache kafka 文档,“max.poll.records”的默认值为 500。

在这里,我试图了解 spring 是如何处理记录的。现在我的问题是,如果我们已经在主题 A 上发布了 500 条消息并且有一个消费者(使用@KafkaListener)订阅了这个主题,

  1. 这个 Spring 监听器是否会获取所有这 500 条记录,然后在将一条记录传递给使用 @KafkaListener 注释的方法之前进行某种缓存,还是一次只提取一条记录并将其传递给方法@KafkaListener 注解

【问题讨论】:

    标签: spring-kafka


    【解决方案1】:

    @KafkaListener 基于KafkaMessageListenerContainer,反过来又完全基于ConsumerRecords<K, V> org.apache.kafka.clients.consumer.Consumer.poll(Duration timeout) API。

    您提到的选项与 Spring for Apache Kafka 无关。即使没有 Spring,您也会处理相同的行为。

    查看返回的ConsumerRecords,了解更多关于如何从 Kafka 获取记录的信息。

    对于 Kafka,我们如何获取记录真的无关紧要。只有偏移提交很重要。 但那是另一回事。您需要自己了解 Spring for Apache Kafka 只是标准 Kafka Client 的包装器。它没有对如何从主题中轮询记录发表意见。

    【讨论】:

    • 您只能控制可以接收的最大记录数;您不能直接控制要接收的最小记录数,只能近似控制,然后,只有当您的记录具有相似的长度时。看到这个question/answer
    • 侦听器容器将获取轮询返回的任何内容,并将它们一次交给侦听器(对于记录侦听器)或作为List<?>(对于批处理侦听器)。跨度>
    • 这正是我正在寻找的。因此,Listener 容器正在执行此操作。非常感谢您提供的详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2020-12-07
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多