本页目录
Kafka 架构
Kafka 把消息系统建模为不可变的、分区的、可回放的 log——不是"消费完就删"的队列。分区内有序保证同 key 消息的顺序,ISR 机制控制复制和持久性的权衡,consumer group 把分区所有权协商变成分布式协调问题。
Partition: 有序不可变 Log
Topic = 多 partition:
Partition 0: [offset 0][offset 1][offset 2]...[offset N] ← append only
Partition 1: [offset 0][offset 1][offset 2]...[offset N]
Partition 2: [offset 0][offset 1][offset 2]...[offset N]
Producer: choose partition by key: partition = murmur2(key) % N_partitions
→ 相同 key 去同一 partition → 该 key 的消息有序
→ key=null → round-robin (负载均衡, 无序)
Consumer: pull-based, offset 由 consumer 管理
ISR (In-Sync Replica)
每个 partition 有 1 个 leader replica + N 个 follower replicas。只有 ISR 中的 replicas 被视为"已同步":
Leader: producer writes → leader: append to log → followers: fetch from leader
→ follower acknowledges: I've replicated up to offset X
→ replica.lag.time.max.ms 内 follower 没确认 → 从 ISR 移除
→ min.insync.replicas: 每条消息至少需这么多 ISR 副本确认才算 committed
如果 leader crash,新的 leader 从 ISR 中的 follower 选举。不在 ISR 中的 follower 有截断风险(log diverged from leader)。
Consumer Group
一个 topic 的 partition 只能被同一 consumer group 中的一个 consumer 消费。partition 在 group members 之间分配。
Consumer group 保证了顺序:每个 partition 只有 1 个 consumer → consumer 看到的该 partition 的消息是顺序的。
Offset Commit
Consumer 自己管理 offset——不依赖 broker push。通常 offset 存储在 Kafka 内部的 __consumer_offsets topic 中:
Consumer: poll() → 获取 N 条消息 → process → commitSync(offsets)
→ enable.auto.commit=false: 手动 commit (推荐, after successful processing)
→ enable.auto.commit=true: 定期自动 commit (可能丢消息)
Log Compaction
基于 key 保留 last value,而非基于时间保留:
Log before compaction:
key=A, value=X
key=B, value=Y
key=A, value=Z ← key A 的最新值
Log after compaction:
key=B, value=Y
key=A, value=Z
→ 适合: KTable (更新流, 最新状态)
→ 不适合: KStream (事件流, 每次变更都是独立事件)
参考
- Kafka: kafka.apache.org/documentation/#design
- ISR: kafka.apache.org/documentation/#replication
Keywords: Kafka, partition, ISR, consumer group, rebalance, offset commit, log compaction