本页目录

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 消费 Topic:3 个 partition P0 P1 P2 Consumer 1 消费 P0 Consumer 2 消费 P1 Consumer 3 消费 P2 每个 partition 只由 1 个 consumer 消费 → 该 partition 内消息顺序有保证 Consumer 2 crash 触发 rebalance 分配给 Consumer 1 or 3 接管 P2 rebalance 只重新分配 partition 归属,同一时刻每个 partition 仍只被 1 个 consumer 消费,顺序保证不受影响

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