簡體   English   中英

spring.kafka.consumer.auto-offset-reset 在 spring-kafka 中如何工作

[英]How does spring.kafka.consumer.auto-offset-reset works in spring-kafka

KafkaProperties Java 文檔:

/**
  * What to do when there is no initial offset in Kafka or if the current offset
  * does not exist any more on the server.
  */
private String autoOffsetReset;

我有包含application.properties hello world application.properties

spring.kafka.consumer.group-id=foo
spring.kafka.consumer.auto-offset-reset=latest

在這種情況下,為所有條目調用@KafkaListener方法。 但預期的結果是@KafkaListener方法只為我發送的最新 3 個選項調用。 我嘗試使用另一個選項:

spring.kafka.consumer.auto-offset-reset=earlisest

但行為相同。

你能解釋一下這個東西嗎?

聚苯乙烯

代碼示例:

@SpringBootApplication
public class Application implements CommandLineRunner {

    public static Logger logger = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args).close();
    }

    @Autowired
    private KafkaTemplate<String, String> template;

    private final CountDownLatch latch = new CountDownLatch(3);

    @Override
    public void run(String... args) throws Exception {
        this.template.send("spring_kafka_topic", "foo1");
        this.template.send("spring_kafka_topic", "foo2");
        this.template.send("spring_kafka_topic", "foo3");
        latch.await(60, TimeUnit.SECONDS);
        logger.info("All received");
    }

    @KafkaListener(topics = "spring_kafka_topic")
    public void listen(ConsumerRecord<?, ?> cr) throws Exception {
        logger.info(cr.toString());
        latch.countDown();
    }
}

更新:

行為不取決於
spring.kafka.consumer.auto-offset-reset

它僅取決於 spring.kafka.consumer.auto-offset-reset=earliest

spring.kafka.consumer.enable-auto-commit

如果我設置spring.kafka.consumer.enable-auto-commit=false - 我會看到所有記錄。

如果我設置spring.kafka.consumer.enable-auto-commit=true - 我只看到最后 3 條記錄。

請澄清 spring.kafka.consumer.auto spring.kafka.consumer.auto-offset-reset屬性的spring.kafka.consumer.auto-offset-reset

Spring Boot 中的KafkaProperties是這樣做的:

public Map<String, Object> buildProperties() {
        Map<String, Object> properties = new HashMap<String, Object>();
        if (this.autoCommitInterval != null) {
            properties.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG,
                    this.autoCommitInterval);
        }
        if (this.autoOffsetReset != null) {
            properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,
                    this.autoOffsetReset);
        }

這個buildProperties()是從buildConsumerProperties()中使用的,它依次用於:

@Bean
@ConditionalOnMissingBean(ConsumerFactory.class)
public ConsumerFactory<?, ?> kafkaConsumerFactory() {
    return new DefaultKafkaConsumerFactory<Object, Object>(
            this.properties.buildConsumerProperties());
}

因此,如果您使用自己的ConsumerFactory bean 定義,請務必重用這些KafkaPropertieshttps : KafkaProperties 額外道具

更新

好的。 我明白發生了什么。

嘗試添加此屬性:

spring.kafka.consumer.enable-auto-commit=false

這樣我們就不會基於某個提交間隔進行異步自動提交。

我們應用程序中的邏輯基於latch.await(60, TimeUnit.SECONDS);之后的退出事實latch.await(60, TimeUnit.SECONDS); . 當我們得到3預期的記錄時,我們退出。 這樣,消費者的異步自動提交可能還不會發生。 因此,下次您運行應用程序時,消費者將從未提交的偏移量中輪詢數據。

當我們關閉自動提交時,我們有一個AckMode.BATCH ,它是同步執行的,我們能夠看到這個foo消費者組的主題中真正最新的記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM