Kafka在单个partition和单个consumerGroup下重复消费的问题

正常情况下

对应一个topic时,一个group中只有一个消费者能消费到某个Partition的数据,该partition只能被一个consumer消费。

在这里插入图片描述

但是在我一波操作下,被重复消费了。因为和消费者有关,所以只展示消费者。

两个消费者代码相同

    @KafkaListener(groupId = "xgroup-1",topicPartitions = {@TopicPartition(topic = "test-topic-1", partitions = {"0"})})
    public void processMessage(String content, ConsumerRecord<? , ?> record, Acknowledgment acknowledgment) {

        Optional<?> kafkaMessage = Optional.ofNullable(record.value());
        // 对象存在
        if (kafkaMessage.isPresent()) {
            System.out.println("线程  "+Thread.currentThread().getName()+"  1:test-topic-1 监听得到: "+content+" record.offset() = " + record.offset());
            acknowledgment.acknowledge();
        }
    }

运行结果:可以发现重复消费了,同一个消费者组内的竟然对一个partition重复消费了

线程  org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1  2 :test-topic-1 监听得到: {"id":1654938099313,"msg":null} record.offset() = 70
线程  org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1  1:test-topic-1 监听得到: {"id":1654938099313,"msg":null} record.offset() = 70

####问题出现原因

因为我使用了下面的注解方式指定了partition所以导致了这个现象的发生,这破坏了kafka自带的rebalance机制,从而也导致出现了重复消费的问题。

@KafkaListener(groupId = "xgroup-1",topicPartitions = {@TopicPartition(topic = "test-topic-1", partitions = {"0"})})

####解决方法

不指定partition即可

//@KafkaListener(groupId = "xgroup-1",topics = "test-topic-1")
### 回答1: 可以回答这个问题Kafka Consumer Group 在 Apache Kafka 中是一个消费者集群的概念。一个消费由一消费成,这些消费者共同消费一个或多个 Kafka Topic。消费中的每个消费使用自己的线程读取独立的分区,以实现高吞吐量容错性。 ### 回答2: Kafka消费(Consumer Group)是Kafka消息队列中的一个重要概念。Kafka是一个分布式的消息系统,允许多个消费者同时从一个或多个主题(Topic)中消费消息。消费是一消费者的集合,它们共同消费相同主题下的消息。 Kafka消费的主要目的是提供负载均衡水平扩展的能力。当有多个消费者加入到同一个消费中时,Kafka会自动将主题中的消息分配给各个消费者,以实现消息的并行消费。每个消费内的消费者将会根据所分配到的分区(Partition)进行消息处理。一个分区只能由同一个消费内的一个消费者进行消费,这样做的好处是可以保证同一个消息只被消费一次。 消费还提供了消费者状态的管理错误处理的机制。消费可以维护每个消费者的消费进度(Offset),这样即使某个消费者出现故障或者新的消费者加入,系统也能够保证消费进度的持续性。此外,当某个消费者发生故障时,Kafka会自动将该消费者的分区重新分配给其他消费者,从而实现故障转移动态扩展。 总之,Kafka消费是一种用于实现负载均衡提高可用性的机制。通过将多个消费织成一个消费,可以实现消息的并行处理高吞吐量的消费。它为消费者状态管理、故障转移动态扩展提供了便利,是实现可靠、灵活高效消费的重要手段。 ### 回答3: Kafka消费Kafka中一个重要的概念,用于进行高效的消息消费消费由多个消费者实例成,这些实例协同工作,同时消费同一个主题的消息。 消费的主要作用是实现消息的并行处理。当一个主题有大量的消息需要消费时,单个消费者实例处理效率可能不高,无法满足实时需求。而多个消费者实例成一个消费,可以并行地消费并处理消息,提高整体的处理速度。 对于同一个主题的消息,Kafka会将其分发到不同的消费者实例,每个实例处理一部分消息。这样做的好处是可以将消息负载均衡地分散到不同的消费者实例上,实现并行处理,提高吞吐量。 消费还具有消费者动态增加减少的能力。新的消费者实例加入到消费后,它们会被分配到之前已经被分配的分区上,然后开始消费消息。同理,当消费者实例离开消费时,它们所处理的分区会被重新分配给其他消费者实例,从而保持整个消费的负载均衡。 消费还支持消费者实例之间的数据共享。即使每个消费者实例专门消费不同的分区,但它们可以通过共享数据进行协同处理。比如,可以通过共享的状态信息进行去重、统计聚合等操作。 总之,Kafka消费是实现高效消息处理的关键所在,可以实现消息的并行消费、负载均衡数据共享,提高整个系统的吞吐量可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值