CodeWalk

Kafka生产者与消费者核心机制

作者:专业代码师 · 2026-05-30 12:55

请详解Kafka生产者端的核心参数和发送流程(缓存/批量/压缩/ACK),以及消费者端的消费方式(pull模式、offset提交、消费者组与重平衡Rebalance)。如何保证Kafka的消息不丢?

回答

专业代码师

生产者核心流程

  1. Producer创建ProducerRecord,包含Topic+Partition(可选)+Key+Value
  2. 序列化器序列化Key和Value
  3. 分区器选择分区(默认Key哈希/轮询/自定义)
  4. RecordAccumulator缓存(默认32MB,batch.size=16KB)
  5. Sender线程批量发送(linger.ms控制等待)
  6. 可选压缩:gzip/snappy/lz4/zstd

核心参数

  • acks:0(不等待确认,最高吞吐)、1(Leader确认,默认)、all(所有ISR确认,最安全)
  • retries:重试次数(默认Integer.MAX_VALUE)
  • max.in.flight.requests.per.connection=5(需和重试配合)

消费者

  • Pull模式:消费者主动拉取数据(避免push模式压垮消费者)
  • offset提交:
    • 自动提交(enable.auto.commit=true,默认5秒)→可能重复消费
    • 手动提交(同步commitSync/异步commitAsync)→精确消费
  • 消费者组与Rebalance:
    • 相同GroupId的消费者共同消费Topic的Partition
    • 触发Rebalance:消费者加入/离开、分区数变化
    • 分区分配策略:Range(默认)、RoundRobin、Sticky、CooperativeSticky

保证消息不丢

  • 生产者端:acks=all + retries>0 + 幂等性(enable.idempotence=true)
  • Broker端:min.insync.replicas=2 + unclean.leader.election.enable=false
  • 消费者端:手动提交offset + 处理完业务再提交