簡體   English   中英

Spring 基於引導的 Kafka 消費者確認策略

[英]Spring Boot based Kafka Consumer Acknowledgement policy

我們有一個基於 Sprring-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.) 說,我從不承認信息? 那么,有多少次,這條消息會從經紀人那里再次傳來?

問題 5.) 這兩個 consumerConfig 屬性MAX_POLL_RECORDS_DOCMAX_POLL_RECORDS_CONFIG什么區別?

答案將不勝感激。

- 謝謝阿迪亞

  1. 只有當容器確認模式為MANUAL (在處理完兩個偏移后都提交)或MANUAL_IMMEDIATE每個偏移被立即提交(同步或異步取決於commitSync屬性)時,您才會收到Acknowledgment

  2. 取決於版本; 對於舊版本,錯誤只是被記錄下來。 對於最新版本,默認錯誤處理程序是SeekToCurrentErrorHandler 默認情況下,將無延遲地嘗試交付 10 次,然后記錄。 您可以配置在重試用盡后調用恢復器(例如DeadLetterPublishingRecoverer

  3. 不; Kafka 只維護一個偏移量; 不承認離散記錄。

  4. 除非您拋出異常(參見 2),否則它不會被重新交付。 請參閱有關錯誤處理的參考手冊。 https://docs.spring.io/spring-kafka/docs/current/reference/html/#annotation-error-handling

  5. 一個 (_DOC) 是屬性文檔的文本,另一個 (_CONFIG) 是屬性名稱。

暫無
暫無

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

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