【问题标题】:why kafka-0.9 multiple consumers in same group consume the same messages为什么同一组中的 kafka-0.9 多个消费者使用相同的消息
【发布时间】:2021-08-01 22:23:02
【问题描述】:

简介:

spring.kafka.consumer.bootstrap-servers=127.0.0.1:9092  
spring.kafka.consumer.group-id=home  
spring.kafka.consumer.enable-auto-commit=false  
spring.kafka.consumer.max-poll-records=10  
spring.kafka.consumer.auto-commit-interval=100  
spring.kafka.consumer.fetch-max-wait=10000  
spring.kafka.listener.ack-mode=manual_immediate  

消费者:

@KafkaListener(topicPartitions={@TopicPartition(topic = "aaa",partitions = {"0"})},group = "home")  
public void doConsume(ConsumerRecord a){  
    log.info("000000 received kafka message:{},offset={}",a.value(),a.offset());  
}

@KafkaListener(topicPartitions={@TopicPartition(topic = "aaa",partitions = {"0"})},group = "home")  
public void doConsume1(ConsumerRecord a){  
    log.info("111111 received  kafka message:{},offset={}",a.value(),a.offset());  
}

制作人:

@Scheduled(cron = "0/2 * * * * ?")  
public void doProduce(){  
  for(int i =0;i<5;i++){  
     kafkaTemplate.send("aaa","say my name!"+ UUID.randomUUID());  
  }  
}

登录控制台:

111111 收到 kafka 消息:说出我的名字!3d0e7171-cae1-44c9-8a9a-f21289160108,offset=42141
000000 收到 kafka 消息:说出我的名字!3d0e7171-cae1-44c9-8a9a-f21289160108,offset=42141
111111 收到 kafka 消息:说出我的名字!90851ac4-1e5f-4ac8-93c9-72acd64ce529,offset=42142
000000 收到 kafka 消息:说出我的名字!90851ac4-1e5f-4ac8-93c9-72acd64ce529,offset=42142
111111 收到 kafka 消息:说出我的名字!4d0fa93d-c7e7-4f44-beba-bfa6c25aee12,offset=42143
111111 收到 kafka 消息:说出我的名字!d1707959-0be2-4ec1-a81d-86ef211cb73d,offset=42144
000000 收到 kafka 消息:说出我的名字!4d0fa93d-c7e7-4f44-beba-bfa6c25aee12,offset=42143
111111 收到 kafka 消息:说出我的名字!79cfea0d-548d-437d-bd05-8b65a27f9e9a,offset=42145
000000 收到 kafka 消息:说出我的名字!d1707959-0be2-4ec1-a81d-86ef211cb73d,offset=42144
000000 收到 kafka 消息:说出我的名字!79cfea0d-548d-437d-bd05-8b65a27f9e9a,offset=42145

实际上,两个消费者根据控制台中的消息消费相同的消息。 谢谢。

【问题讨论】:

  • 谁向主题topic = "spyfool"发送信息?
  • 哦,那是编辑的错误,其实两个消费者听的是同一个话题。
  • 可能 SpringBoot 将它们合并为一个对 Kafka 的订阅,接收消息,然后将其提供给两个消费者。要验证这个猜测,您可以使用命令行工具检查 Kafka 代理,看看是否有一个或两个消费者。

标签: java spring spring-boot apache-kafka


【解决方案1】:

当给 Kafka Listener 一个 Topic Partition 时,你告诉它使用手动分配而不是使用订阅机制...

assign 不适用于消费者组机制

所以你有两个消费者分配给主题aaa分区0...所以他们都收到相同的消息

顺便说一句。设置组的正确注释属性是groupId

【讨论】:

  • 我使用的spring-kafka版本是1.0.0,这个版本没有'groupId'的注解属性,TT。感谢你的回答解决了我的问题,还有你对了,这就是问题所在。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多