我對 Kafka 和 Spring Boot 有點陌生,并試圖讓我的應(yīng)用程序從主題的特定分區(qū)讀取數(shù)據(jù)。 @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);}當(dāng)我嘗試運行該程序時,它給了我一個錯誤分區(qū) single.attendance-0 偏移量 308 處的偏移量提交失?。簠f(xié)調(diào)器不知道此成員。和警告失?。禾峤粺o法完成,因為組已經(jīng)重新平衡并將分區(qū)分配給另一個成員。這意味著后續(xù)調(diào)用 poll() 之間的時間比配置的 max.poll.interval.ms 長,這通常意味著 poll 循環(huán)花費了太多時間處理消息。您可以通過增加 max.poll.interval.ms 或通過使用 max.poll.records 減少 poll() 中返回的批次的最大大小來解決此問題。如何讓我的消費者從特定分區(qū)讀取數(shù)據(jù)?您能至少給一個提示嗎?
1 回答

開心每一天1111
TA貢獻(xiàn)1836條經(jīng)驗 獲得超13個贊
Kafka 為每個分區(qū)單獨分配消費者。本實現(xiàn)中無需在@KafkaListener中進(jìn)行配置。
@KafkaListener(id = "singleLnr", groupId = "${kafka.consumer.group.id}",containerFactory = "singleFactory", topics = "${kafka.topic.singleAttendance}") public void consume2(ConsumerRecord attendanceInfo) { System.out.println(attendanceInfo); }
添加回答
舉報
0/150
提交
取消