6-Kafka速答

### 文章目录
- [6-Kafka速答](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [@[toc]](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.1 Kafka 核心组件](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.2 偏移量三剑客](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.3 Controller 选举(ZK 模式)](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.4 副本集合](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.5 Producer 发送流程(简)](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.6 ACK 应答策略](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.7 消息重复 & 丢失根因](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.8 Follower 拉取 Leader](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.9 Consumer 拉取消息](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.10 消费者重复 / 丢失](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
- [6.11 全局有序保证](#文章目录 6-Kafka速答 @[toc] 6.1 Kafka 核心组件 6.2 偏移量三剑客 6.3 Controller 选举(ZK 模式) 6.4 副本集合 6.5 Producer 发送流程(简) 6.6 ACK 应答策略 6.7 消息重复 & 丢失根因 6.8 Follower 拉取 Leader 6.9 Consumer 拉取消息 6.10 消费者重复 / 丢失 6.11 全局有序保证)
6.1 Kafka 核心组件
- Broker:Kafka 服务器进程
- Topic:逻辑消息队列
- Partition:Topic 物理分片
- Replica:分区副本
- Leader / Follower:副本角色
- Controller:集群"总管" Broker
- ZK:旧版依赖 ZooKeeper 选举 Controller
- Producer / Consumer / Consumer Group:生产与消费端
6.2 偏移量三剑客
缩写 | 全称 | 含义 | 可见性 |
---|---|---|---|
LSO | Log Start / Stable Offset | ① 日志文件起始偏移量(文件名数字)<br>② 事务隔离级别可见性边界(read_committed 用) | 事务型消费者 |
LEO | Log End Offset | 当前分区下一条待写入位置 | 内部使用 |
HW | High Watermark | 消费者可见"高水位",< HW 的数据才允许被消费 | 所有消费者 |
6.3 Controller 选举(ZK 模式)
- 所有 Broker 监听
/controller
临时节点 - 谁创建成功谁当选;节点消失即触发重新选举
- 纪元(epoch)+1,防止脑裂
6.4 副本集合
- AR = Assigned Replicas:分区全部副本
- ISR = In-Sync Replicas:正在同步的副本(含 Leader),满足 replica.lag.time.max.ms
- OSR = Out-of-Sync Replicas:落后副本
- 动态伸缩:副本达标从 OSR→ISR,落后从 ISR→OSR
6.5 Producer 发送流程(简)
- 序列化 → 分区器选分区 → 累加器缓存
- Sender 线程批量发送 → 对应分区 Leader
- 等待 ACK → 更新元数据 / 重试
6.6 ACK 应答策略
acks | 含义 | 吞吐 | 可靠性 |
---|---|---|---|
0 | 发到网络缓冲区即返回 | 高 | 低 |
1 | Leader 写盘即返回 | 中 | 中 |
-1/all | ISR 全部写盘才返回 | 低 | 高(默认) |
> 幂等 / 事务必须 acks=-1 且开启重试
6.7 消息重复 & 丢失根因
- 丢失:禁重试 + 网络异常 / Leader 宕机
- 重复:重试时网络抖动导致重复发送
- 解决
- 会话内重复:开启幂等(enable.idempotence=true)
- 跨会话重复:使用事务 Producer
6.8 Follower 拉取 Leader
Follower 周期性发送 FetchRequest(携带当前 LEO)→ Leader 按 HW 截断数据返回 → Follower 写盘 → 更新自身 LEO → Leader 更新 HW
6.9 Consumer 拉取消息
Consumer 发送 FetchRequest(携带 offset)→ Broker 按 offset 顺序读日志 → 返回消息 → 本地处理 → 定时(或手动)提交 offset
6.10 消费者重复 / 丢失
- 重复:自动提交间隔内崩溃,重启后从上次已提交 offset 重新消费
- 丢失:已提交 offset 但消息未处理完即崩溃
- 对策 :
- 手动同步 commitSync / 异步 commitAsync
- 消费-处理-提交原子化(幂等处理或事务)
6.11 全局有序保证
- 生产有序
- 单分区 + 序列号 + 在途请求缓冲区 ≤5
- 存储有序
- 同一分区顺序追加写日志
- 消费有序
- 单分区仅被组内一个消费者按 offset 顺序读取
> 多分区无法保证全局有序,只能分区内有序
- 单分区仅被组内一个消费者按 offset 顺序读取