基于 Spring Boot 的 Kafka 消费者确认策略

时间:2021-03-08 12:53:14

标签: java apache-kafka kafka-consumer-api spring-kafka

我们有一个基于 Spring-Boot 的 Kaffka 消费者,我们为它创建了一个这样的工厂:-

@Bean
    public ConsumerFactory<String, Customer> customerConsumerFactory() {
        Map<String, Object> config = new HashMap<>();

        config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "bootstrapServers");
        config.put(ConsumerConfig.GROUP_ID_CONFIG, "${kafka.customer.consumer.group}");
        config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);

        config.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
        config.put(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, "5000");
        config.put(ConsumerConfig.REQUEST_TIMEOUT_MS_CONFIG, "5000");
        config.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG,"25000");
        config.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG,String.valueOf(Integer.MAX_VALUE));
        config.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "2");

        return new DefaultKafkaConsumerFactory<>(config, new StringDeserializer(),
                new JsonDeserializer<>(PaymentsHubResponse.class));
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory<String, Customer> customerConsumerKafkaListenerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, Customer> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(customerConsumerFactory());
        return factory;
    }

通过上述配置,我们打算在一次轮询中,该消费者最多读取 2 条记录,并且我们有手动确认策略。现在,这是消费者的代码:-

  @KafkaListener(topics = "${kafka.consumer.topic}", groupId = "${kafka.consumer.group}", containerFactory="customerConsumerKafkaListenerFactory")
public void consumeResponseEventFromPH(Customer customerObject, Acknowledgment ack) {
   acknowledgment.acknowledge();
   // Business Logic.
}

问题 1 .) 这条语句 acknowledgment.acknowledge(); 是否会同时向 Kafka 代理发送两条消息的确认,或者此方法本身是否会执行 2 次,对每个传入消息执行一次?

问题 2.) 如果在处理这些消息的过程中出现问题怎么办?这些消息会永远丢失吗?

问题 3.) 有没有办法在每个消息级别发送条件确认?

问题 4.) 说,我从不确认消息?那么,这条消息会从 Broker 来回传出多少次?

问题 5.) 这 2 个 consumerConfig 属性 MAX_POLL_RECORDS_DOCMAX_POLL_RECORDS_CONFIG 之间有什么区别?

答案将不胜感激。

- 谢谢 阿迪亚

1 个答案:

答案 0 :(得分:1)

  1. 如果容器确认模式为 Acknowledgment(两个偏移量都在处理后提交)或 MANUAL 每个偏移量立即提交(同步或异步取决于 MANUAL_IMMEDIATE 属性)。

  2. 取决于版本;对于旧版本,错误只是被记录下来。在最新版本中,默认错误处理程序是 commitSync。默认情况下,交付将无延迟地尝试 10 次,然后记录。您可以配置一个恢复器在重试用完后调用(例如 SeekToCurrentErrorHandler.

  3. 没有; Kafka 只维护一个偏移量;不承认离散记录。

  4. 除非你抛出异常(见2),否则它不会被重新传递。请参阅有关错误处理的参考手册。 https://docs.spring.io/spring-kafka/docs/current/reference/html/#annotation-error-handling

  5. 一个 (_DOC) 是属性文档的文本,另一个 (_CONFIG) 是属性名称。

相关问题