Skip to content
进阶

一句话答案

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");

2. Broker 端 — 持久化配置

properties
# 副本数 >= 2(Leader 宕机时 Follower 可以接管)
replication.factor=3

# ISR 最小副本数(防止只剩 Leader 一个副本时允许写入)
min.insync.replicas=2

# 防止 Leader 宕机后选举不符合条件的副本
unclean.leader.election.enable=false

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
}

三端综合防丢失方案:

生产者:acks=-1 + retries=3 + 幂等性(enable.idempotence=true)
Broker:replication.factor=3 + min.insync.replicas=2
消费者:auto.commit=false + 手动 commitSync/commitAsync
追问与易错

追问方向:

  • 这个概念在你的项目中是怎么应用的?
  • 和相关技术/方案相比有什么优劣?
  • 如果出了问题你会怎么排查?

易错点:

  • ❌ 只知道概念不知道原理——面试官会追问底层实现
  • ❌ 缺乏实际使用经验——结合项目场景回答更有说服力

💡 记忆锚点

Kafka防丢三道闸:生产端(acks=all,确认信全收到才放行)、Broker(3副本+min.insync=2,至少两本账对上)、消费端(手动commit,干完活再签字)。三闸缺一不可,否则消息就从缺口漏掉。