Kafka重复消费、消息丢失、消息乱序

一、应用场景

  • 大量扫码/刷卡交易订单日志传输
  • 日志采集

二、产生原因

  • 日志采集客户端(Producer):
    • 超时重传,日志重复(enable.idempotence=false重复发送)
    • 消息失败,未持久化(acks=0不重试;或acks=1但leader闪退)
    • 批量发送,数据乱序(max.in.flight.requests.per.connection>1批量发送)
  • Kafka服务器:
    • OSR参与选举,导致消息丢失(unclean.leader.election.enable=true脱节选举)
    • ISR列表为1或空,未备份(min.insync.replicas<=1副本过少)
  • 日志处理应用(Consumer):
    • 消费异常,消息丢失(enable-auto-commit=true自动提交)
    • 未提交Offset,重复消费(异常闪退和重平衡)

三、解决方案

  • 日志采集客户端(Producer):

    ## 解决乱序问题
    ## 批量发送改为每次逐个发送,默认5
    max.in.flight.requests.per.connection=1
    
    ## 解决重复生产
    ## 每个ProducerId全局唯一;ack=all和retries>1保证持久化
    enable.idempotence=true
    ack=all
    retries=2
    ## 转移处理异常生产
    
  • Kafka服务器:

    ## 解决数据丢失问题
    ## 禁止OSR参与选取leader
    unclean.leader.election.enable=false
    ## ISR列表至少2个以上
    min.insync.replicas=2
    
  • 日志处理应用(Consumer):

    ## 解决消息丢失
    ## 禁止自动提交
    enable.auto.commit=false
    
    ## 重复消费
    ## 接口幂等性;MySQL记录每一个Offset消费状态;
    

四、参数

参数 作用和优点 缺点
max.in.flight.requests.per.connections=1 生产者发送缓冲池(flight)只缓冲一个消息记录,避免乱序;类似同步队列AQS,一次只能发送一个 吞吐量下降
enable.idempotence=true 生产者维护全局唯一producerId,避免重复;类似主键,重复数据不会重复持久化 retries=2配合
acks=all 生产者要求Kafka持久化所有ISR,保证持久化;类似全同步复制 ISR列表可能空或只有leader;min.insync.replicas=2配合
retries=2 生产者超时重发次数,保证持久化;类似超时重传 可能造成重复持久化;enable.idempotence=true配合
unclean.leader.election.enable=false Kafka中OSR参数竞选Leader,保证Kafka高可用; OSR消息脱节,造成大量数据丢失;不开启
min.insync.replicas=2 Kafka中ISR至少2个,保证持久化;类似半同步复制 acks=all配合
enable.auto.commit=false 消费者关闭自动提交,避免消息丢失;类似事务提交 需要额外维护Offset,容易造成重复消费,需要消费幂等性
posted @ 2022-04-19 14:39  SArtOnline  阅读(532)  评论(0)    收藏  举报