[英]How multiple consumer can listen to multiple topic in spring boot Kafka?
[英]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.