Kafka 的 acks 机制:0、1、all 分别意味着什么?
本文目录
大数据开发面试回答模板(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