外观
一句话答案
Kafka 核心概念:Broker(节点)、Topic(主题)、Partition(分区,有序)、Replica(副本 Leader+Follower)、Consumer Group。
核心要点
消息丢失可能发生在三个环节:
1. 生产者端 — 发送确认机制(acks)
java
// acks 参数控制 Broker 如何确认收到消息
Properties props = new Properties();
// acks=0:发完不等确认(最快,最容易丢)
props.put("acks", "0");
// acks=1:Leader 写入后确认(Leader 宕机可能丢失,因为 Follower 未同步)
props.put("acks", "1");
// acks=-1 / all:Leader + 所有 ISR 副本都写入后才确认(最安全,推荐)
props.put("acks", "-1");
// 同时配置重试(网络抖动导致的丢失)
props.put("retries", "3");
props.put("retry.backoff.ms", "100");1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2. Broker 端 — 持久化配置
properties
# 副本数 >= 2(Leader 宕机时 Follower 可以接管)
replication.factor=3
# ISR 最小副本数(防止只剩 Leader 一个副本时允许写入)
min.insync.replicas=2
# 防止 Leader 宕机后选举不符合条件的副本
unclean.leader.election.enable=false1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
3. 消费者端 — 手动提交 Offset
java
// 默认 auto.commit=true(自动提交),可能导致:
// 消息拉取成功 → 自动提交 offset → 处理失败 → 消息丢失!
// 正确做法:手动提交,处理完成后再提交
consumer.subscribe(Collections.singletonList("topic"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
try {
process(record); // 1. 先处理
} catch (Exception e) {
// 处理失败,不提交,下次重新消费
continue;
}
}
consumer.commitSync(); // 2. 处理完再提交 offset
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
三端综合防丢失方案:
生产者:acks=-1 + retries=3 + 幂等性(enable.idempotence=true)
Broker:replication.factor=3 + min.insync.replicas=2
消费者:auto.commit=false + 手动 commitSync/commitAsync1
2
3
2
3
追问与易错
追问方向:
- 这个概念在你的项目中是怎么应用的?
- 和相关技术/方案相比有什么优劣?
- 如果出了问题你会怎么排查?
易错点:
- ❌ 只知道概念不知道原理——面试官会追问底层实现
- ❌ 缺乏实际使用经验——结合项目场景回答更有说服力
💡 记忆锚点
Kafka防丢三道闸:生产端(acks=all,确认信全收到才放行)、Broker(3副本+min.insync=2,至少两本账对上)、消费端(手动commit,干完活再签字)。三闸缺一不可,否则消息就从缺口漏掉。