Kafka生产者与消费者核心机制
请详解Kafka生产者端的核心参数和发送流程(缓存/批量/压缩/ACK),以及消费者端的消费方式(pull模式、offset提交、消费者组与重平衡Rebalance)。如何保证Kafka的消息不丢?
回答
专业代码师
生产者核心流程:
- Producer创建ProducerRecord,包含Topic+Partition(可选)+Key+Value
- 序列化器序列化Key和Value
- 分区器选择分区(默认Key哈希/轮询/自定义)
- RecordAccumulator缓存(默认32MB,batch.size=16KB)
- Sender线程批量发送(linger.ms控制等待)
- 可选压缩: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 + 处理完业务再提交