2025年Java面试宝典 点击获取
(网盘链接:<span style="color:blue">https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g</span> 提取码: 9b3g)
一、Kafka生产者与消费者的核心机制(从面试题出发)
最近帮候选人复盘面试,发现很多同学对Kafka生产者消费者模型的理解停留在理论层面,遇到真实场景题就容易卡壳。比如被问过这种题:“订单系统用Kafka做削峰填谷,生产者发送消息时突然遇到网络抖动,该怎么保证数据不丢?”

这里其实考的是生产者acks配置和重试机制的结合使用。口述时可以这样拆解:
- 设置
acks=all确保消息被所有ISR副本确认 - 开启
retries=Integer.MAX_VALUE无限重试 - 配合
max.block.ms参数避免生产者阻塞 - 使用异步回调监听发送结果
如果候选人能进一步提到幂等性和事务消息,会更有竞争力。比如:“如果下游系统要求消息严格有序,可以用enable.idempotence=true开启生产者幂等,避免网络重试导致消息重复”。
二、消费者组如何应对高并发场景?(高频考点)
消费者组(Consumer Group)的负载均衡机制是面试必问点。比如这种题:“某Kafka集群有3个分区,消费者组启动4个实例会发生什么?”
答案看似简单(3个实例消费,1个闲置),但进阶答法需要结合rebalance机制和partition分配策略:
- 触发
rebalance重新分配partition - 默认使用
RangeAssignor策略可能导致分配不均 - 建议改用
RoundRobinAssignor或自定义分配器 - 消费者心跳超时可能被踢出组
这里可以甩个实际案例:某电商大促期间消费者频繁掉线,最后发现是session.timeout.ms设置过短导致误判离线。调整到合理值后,吞吐量提升了40%。
三、真实面试题案例拆解(附送避坑指南)
去年辅导过一个候选人,被问到一个综合题:“设计一个实时风控系统,用Kafka处理用户行为日志,如何保证消息零丢失且处理不延迟?”

我们的解题思路是这样的:
生产者侧:
- 同步发送+手动flush
- 本地WAL日志做灾备(比如用LevelDB存储未确认消息)
Broker侧:
- 设置
min.insync.replicas=2防止脑裂 - 监控ISR列表变化告警
消费者侧:
- 关闭自动提交offset
- 使用批量处理+异步提交
- 引入死信队列(DLQ)处理异常数据
这里有个坑:很多候选人会忽略消费者提交offset的时机。如果在处理前提交,可能丢数据;如果在处理后提交,可能重复消费。比较稳妥的方案是批处理完成后提交offset,并记录已处理消息的ID做幂等校验。
四、调优与监控(加分项整理)
如果面试官问到性能优化,可以从这些点切入:
-
生产者调优:
- 调整
batch.size和linger.ms平衡吞吐与延迟 - 用
compression.type压缩消息(推荐zstd)
- 调整
-
消费者调优:
- 增大
fetch.max.bytes提高单次拉取量 - 多线程消费时注意offset提交冲突
- 增大
-
监控指标:
- 生产者:发送延迟、批次压缩率
- 消费者:消费延迟、lag波动
- Broker:分区负载均衡、网络吞吐
这里可以提到Consumer Lag监控的重要性。比如某次故障排查发现,某个partition的lag突然飙升,最后定位到是消费者代码里同步调用了外部API导致线程阻塞。
最后提个醒,如果想系统性准备Java面试,可以看看面试鸭整理的资料库(悄悄说,通过面试鸭返利网购买会员能返利25元)。他们的题库覆盖了Kafka的13种高频考点,包括今天提到的生产者消费者案例,还有更复杂的Exactly-Once实现原理等硬核内容。



