为了账号安全,请及时绑定邮箱和手机立即绑定

如何让Kafka消费者从特定主题分区读取Spring Boot

如何让Kafka消费者从特定主题分区读取Spring Boot

饮歌长啸 2023-11-10 16:13:36
我对 Kafka 和 Spring Boot 有点陌生,并试图让我的应用程序从主题的特定分区读取数据。 @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);}当我尝试运行该程序时,它给了我一个错误分区 single.attendance-0 偏移量 308 处的偏移量提交失败:协调器不知道此成员。和警告失败:提交无法完成,因为组已经重新平衡并将分区分配给另一个成员。这意味着后续调用 poll() 之间的时间比配置的 max.poll.interval.ms 长,这通常意味着 poll 循环花费了太多时间处理消息。您可以通过增加 max.poll.interval.ms 或通过使用 max.poll.records 减少 poll() 中返回的批次的最大大小来解决此问题。如何让我的消费者从特定分区读取数据?您能至少给一个提示吗?
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

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);
    }


查看完整回答
反对 回复 2023-11-10
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信