kafka重复消费问题

问题描述:

       在消费者处理数据慢的时候(消费能力低),消费者会重复消费某个局部数据。在消费能力不变的情况下,陷入死循环。只有在消费能力增强后,才会跳出这个重复消费的死循环。

原理解析:

上图就是完整的kafka消费的过程,在consumer里面配置了一个超时时间。如果步骤2处理消息超时,那么consumer进行第3步会失败。这时候再次进入步骤1拉取重复的数据,如此往复。

验证过程:

搭建一个简单的springboot,集成kakfa,添加配置信息如下:

spring.kafka.bootstrap_servers=${KAFKA_ADDRESS:10.199.1.0:9092}
spring.kafka.consumer.group_id=${KAFKA_GROUP_ID:0}
spring.kafka.consumer.max-poll-records=1000
spring.kafka.consumer.properties.max.partition.fetch.bytes=65536
spring.kafka.consumer.properties.receive.buffer.bytes=65536
spring.kafka.consumer.properties.session.timeout.ms=10000

spring.kafka.consumer.max-poll-records表示每次最多能拉取1000个数据,spring.kafka.consumer.properties.session.timeout.ms表示超时时间,这里设置10秒。

再来看一下consumer的代码:

@Component
public class KafkaConsumer {
    @KafkaListener(topics = {"test"})
    public void receive(ConsumerRecord<String, String> consumerRecord){
        System.out.println("test--消费消息:" + consumerRecord.key());
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

这样的预期结果是每次都在重复执行同样的连续1000条数据。下面看一下验证结果:

开始消费的日志:

重复消费的日志:

结果正好是在1000个数据之后,提交失败。并且日志打出提示,建议你增加session timeout的时间或者减少从kafka里面取到一批的数据量。

总结:

1、kafka取到数据后,应该异步去处理。这样可以增加消费能力。

2、坚持做一件事不容易,比如写博客。自律是做人做事一项必要修炼。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Kafka重复消费指的是消费者可能会在某些情况下重复消费相同的消息。Kafka 是一个分布式消息系统,它的消费者组可以有多个消费者同时消费同一个主题的消息。当某个消费消费一条消息时,Kafka 就会将该消息的 offset 值保存在消费者组的 offset 管理器中。这样,其他消费者就可以从该 offset 值开始消费后续的消息。 Kafka重复消费可能发生在以下几种情况下: 1. 消费者手动重置 offset:如果消费者手动将 offset 重置到之前已经消费过的位置,那么接下来消费者就会重新消费之前已经消费过的消息。 2. 消费者组 rebalance:当消费者组发生 rebalance 时,消费者会重新分配分区。如果一个消费者之前消费了某个分区的消息,但在 rebalance 后该分区被分配给了另一个消费者,那么该消费者就会重新消费该分区之前已经消费过的消息。 3. 消息重复发送:在某些情况下,生产者可能会重复发送相同的消息。如果消费者在消费该消息时出现了异常,那么该消息就可能被重复消费。 为了避免 Kafka重复消费,可以考虑使用以下几种策略: 1. 自动管理 offset:Kafka 提供了自动管理 offset 的功能,消费者可以将 offset 保存在 Kafka 中,这样就可以避免手动重置 offset 的问题。 2. 避免 rebalance:可以通过调整消费者组的配置来避免 rebalance 的频繁发生。 3. 消费幂等性:消费者可以实现消费幂等性,即使消息重复消费也不会对系统产生影响。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值