Kafka常见的丢失与重复消费问题

一.数据丢失问题

生产者数据不丢失
      同步模式:配置=1/0(0不等待,1只有Leader收到,-1所有副本成功 ; 三种机制,性能依次递减 (producer吞吐量降低),数据健壮性则依次递增。)
                leader partition挂了,数据就会丢失。
                解决:设置为-1保证produce写入所有副本算成功
          producer.type=sync
          request.required.acks=-1
      异步模式,当缓冲区满了,如果配置为0(没有收到确认,一满就丢弃),数据立刻丢弃
                解决:不限制阻塞超时时间。就是一满生产者就阻塞
          producer.type=async 
          request.required.acks=1 
          queue.buffering.max.ms=5000 
          queue.buffering.max.messages=10000 
          queue.enqueue.timeout.ms = -1 
          batch.num.messages=200

二.消费者重复消费
    1.offset为自动提交,正在消费数据,kill消费者线程,下次重复消费。
    2.设置自动提交,关闭kafka,close之前,调用consumer.unsubscribed()则可能部分offset没有提交。
    3.消费程序和业务逻辑在一个线程,导致offset提交超时。
    
一般解决之法:
    1.幂等操作,重复消费不会产生问题
    2.用手动提交,注意代码质量防止超时等问题
        消费端配置非自动提交spring.kafka.consumer.enable-auto-commit=false
        消费从上次消费最后一个offset起spring.kafka.consumer.auto-offset-reset=latest
        手动提交需要配置spring.kafka.listener.ack-mode: manual_immediate
        
    auto.offset.reset值含义解释
        earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费 
        latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据 
        none:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常

    AckMode属性解释:
        RECORD:每处理一条commit一次
        BATCH(默认):每次poll的时候批量提交一次,频率取决于每次poll的调用频率
        TIME:每次间隔ackTime的时间去commit(跟auto commit interval有什么区别呢?)
        COUNT:累积达到ackCount次的ack去commit
        COUNT_TIME:ackTime或ackCount哪个条件先满足,就commit
        MANUAL:listener负责ack,但是背后也是批量上去
        MANUAL_IMMEDIATE:listner负责ack,每调用一次,就立即commit

Kafka常见的丢失与重复消费问题_第1张图片

你可能感兴趣的:(Kafka常见的丢失与重复消费问题)