簡體   English   中英

如何讓 Kafka 消費者從特定主題分區 Spring 引導讀取

[英]How to make Kafka consumer reads from specific topic partition Spring Boot

我對 Kafka 和 Spring 啟動有點陌生,並試圖讓我的應用程序從主題的特定分區中讀取。

 @KafkaListener(id = "singleLnr", groupId = "${kafka.consumer.group.id}",containerFactory = "singleFactory", topicPartitions = @TopicPartition(topic = "${kafka.topic.singleAttendance}", partitions = {"0"}))
public void consume2(ConsumerRecord attendanceInfo) {
    System.out.println(attendanceInfo);
}

單廠代碼

@Bean(name = "singleFactory")
public KafkaListenerContainerFactory singleFactory() {
    ConcurrentKafkaListenerContainerFactory<String, Map<String, String>> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    factory.setBatchListener(false);
    factory.setMessageConverter(converter());
    return factory;
}

這也是我的消費者工廠配置

 @Bean(name = "consumerFactory")
public ConsumerFactory<String, Map<String, String>> consumerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBootstrapAddress);
    props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
    props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, 1000);
    props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 60000);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaConsumerGroupId);
    return new DefaultKafkaConsumerFactory<>(props);
}

當我嘗試運行程序時,它給了我一個錯誤

在偏移量 308 處的分區 single.attendance-0 上的偏移量提交失敗:協調器不知道該成員。

和警告

failed:由於組已經重新平衡並將分區分配給另一個成員,因此無法完成提交。 這意味着后續調用 poll() 之間的時間比配置的 max.poll.interval.ms 長,這通常意味着輪詢循環花費了太多時間處理消息。 您可以通過增加 max.poll.interval.ms 或通過使用 max.poll.records 減少 poll() 返回的批次的最大大小來解決這個問題。

如何讓我的消費者從特定分區讀取? 請你至少給一個提示。

Kafka 自己為每個分區分配消費者。 在此實現中無需在 @KafkaListener 中配置它。

@KafkaListener(id = "singleLnr", groupId = "${kafka.consumer.group.id}",containerFactory = "singleFactory", topics = "${kafka.topic.singleAttendance}")
    public void consume2(ConsumerRecord attendanceInfo) {
        System.out.println(attendanceInfo);
    }

暫無
暫無

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

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