订阅更新

Kafka 的 acks 机制:0、1、all 分别意味着什么?

专栏文章 约 5 分钟读完

本文目录
  1. 大数据开发面试回答模板(1分钟)
  2. 1. ACK 有哪几种?
  3. 2. 什么是 ISR?
  4. 3. ACK=all 就一定不丢数据吗?
  5. 4. 为什么有时 ack=all 还是丢数据?
  6. 5. 大厂常用配置
  7. 6. 面试高频追问

大数据开发面试回答模板(1分钟)

Kafka 的 ACK 机制决定 Producer 发送消息后需要等待多少副本确认。
acks=0 表示不等待确认,性能最高但可能丢数据;
acks=1 表示 Leader 写入成功即返回,性能和可靠性平衡;
acks=all 表示 ISR 中所有副本同步成功后返回,可靠性最高。
实际生产中通常结合 replication.factor=3、min.insync.replicas=2、acks=all、enable.idempotence=true 使用,以保证消息不丢失且避免重复写入。

这套回答基本能覆盖 Kafka 面试中关于 ACK 机制 80% 以上的问题。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

Kafka 的 ACK(Acknowledgment)机制,本质上是Producer 发送消息后,Broker 返回确认的策略,决定了消息的可靠性和性能之间的平衡。

1. ACK 有哪几种?

ack = 0

Producer 发出去就不管了,不等 Broker 返回结果。

acks=0

流程:

Producer
   |
   |-----> Broker
   |
立即返回成功

特点:

✅ 性能最高
❌ Broker 挂了消息可能直接丢失
❌ Producer 不知道是否发送成功

适用:

  • 日志采集
  • 埋点
  • 对数据丢失不敏感

ack = 1

Leader Partition 写成功就返回。

acks=1

流程:

Producer
    |
    |-----> Leader
               |
          写入本地日志
               |
          返回成功

特点:

✅ 性能较好

✅ Leader 挂掉前大部分数据安全

❌ Leader 还没同步给 Follower 就宕机

❌ 数据可能丢失

例如:

Leader 收到消息
↓
返回成功给 Producer
↓
Leader 宕机
↓
Follower 还没同步
↓
消息丢失

适用:

  • 大多数业务
  • 实时数仓
  • 数据监控

很多公司默认:

acks=1

ack = all(或 -1)

Leader 和 ISR 副本全部同步成功后才返回。

acks=all

等价:

acks=-1

流程:

Producer
    |
    |-----> Leader
               |
         同步到ISR
         Follower1
         Follower2
               |
         全部成功
               |
         返回ACK

特点:

✅ 最安全

✅ 基本不会丢数据

❌ 延迟最高

❌ 吞吐下降

适用:

  • 订单
  • 支付
  • 核心业务数据
  • 金融场景

2. 什么是 ISR?

ISR(In-Sync Replicas)

同步副本集合。

例如:

Partition-0

Leader
 ├─ Follower1
 ├─ Follower2
 └─ Follower3

如果:

Follower3 落后太多

就会被踢出 ISR:

ISR
 ├─ Leader
 ├─ Follower1
 └─ Follower2

此时:

acks=all

只需要 ISR 中副本同步成功即可。


3. ACK=all 就一定不丢数据吗?

不一定。

还要配:

replication.factor=3
min.insync.replicas=2
acks=all

例如:

副本数=3

Leader
Follower1
Follower2

配置:

min.insync.replicas=2

表示:

至少 2 个副本成功写入才算成功。


如果:

Leader
Follower1

都写成功

返回 ACK

此时:

Leader 挂
Follower1 升为 Leader

数据仍然存在。


4. 为什么有时 ack=all 还是丢数据?

因为没配:

unclean.leader.election.enable=false

脏选举

假设:

Leader
Follower1
Follower2

消息只同步到:

Leader
Follower1

Follower2 落后。

此时:

Leader 挂
Follower1 挂

Kafka 可能让:

Follower2

成为新 Leader。

但它没有最新数据。

结果:

数据丢失

因此生产环境建议:

unclean.leader.election.enable=false

5. 大厂常用配置

普通业务

acks=1
retries=3

优点:

  • 性能高
  • 可接受少量丢失

核心业务

acks=all
retries=Integer.MAX_VALUE
enable.idempotence=true

优点:

  • 不丢数据
  • 不重复数据

金融级

acks=all
enable.idempotence=true
min.insync.replicas=2
replication.factor=3
unclean.leader.election.enable=false

这是 Kafka 高可靠经典配置。


6. 面试高频追问

Q1:ACK 和副本机制有什么关系?

ACK 只决定 Producer 等谁确认:

acks=1
→ Leader确认

acks=all
→ ISR全部确认

真正的数据可靠性还依赖:

  • replication.factor
  • ISR
  • min.insync.replicas

Q2:ACK=1 会丢数据吗?

会。

场景:

Producer
 ↓
Leader收到
 ↓
返回ACK
 ↓
Leader宕机
 ↓
Follower还没同步
 ↓
数据丢失

Q3:ACK=all 一定安全吗?

不一定。

还需要:

replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false

刷题进度保存在当前浏览器