Kafka64 条

Apache Kafka 是什么

Kafka 是分布式事件流平台:以追加日志形式持久化消息,通过分区并行、多副本容错,支撑发布订阅、数据管道与实时处理三类场景。

Kafka 是什么

Kafka 是分布式的发布订阅事件流平台:消息以追加日志的形式持久化到磁盘,按分区并行读写,靠多副本容错。它同时承担三件事——解耦上下游的缓冲层、多条链路共享的数据总线、流处理任务的输入输出通道。

为什么用日志模型

日志追加是顺序写,磁盘顺序写性能接近内存随机写,这让 Kafka 用普通磁盘就能扛住很高的吞吐。更重要的是「读取不删除数据」:消费只推进位移,消息由保留策略统一清理,所以同一份数据可以被多个消费组各读一遍,也可以按位点重放做补数。

基本信息

定位分布式事件流/消息平台
核心抽象Topic、Partition、Producer、Consumer、Broker
存储模型分区内追加日志,按位移读取,保留期内可重放
容错每分区一个 Leader 加若干 Follower,ISR 内选举
典型用途链路解耦、削峰缓冲、实时计算输入输出、变更数据分发

典型使用场景

  • 业务库变更经 CDC 进 Kafka,再分发给数仓、缓存与检索多条下游
  • 订单、支付等高峰流量先入队列削峰,下游按自身能力消费
  • 作为实时流的输入输出:Flink 读一个主题、写另一个主题
  • 跨系统解耦:上游只管投递,新增下游不需要改动上游
  • 作为临时数据缓冲保留若干天,方便下游故障后重放补数

组成示意

组成示意
# 一个主题被拆成多个分区,分区分布在多个 Broker 上
Producer → Broker(Topic orders:Partition 0/1/2,每个分区 1 个 Leader + 2 个 Follower)→ Consumer

# 分区内严格有序,跨分区不保证顺序
Partition 0: [offset 0][1][2][3] ...  ← 追加写入,只能往末尾加
Partition 1: [offset 0][1][2]

# 消费组按分区分配:组内一个分区同一时刻只归一个成员
Consumer Group A ── 各成员分到不同分区,合起来读完整个主题

核心概念读法

概念含义要点
Topic消息的逻辑分类分区数与保留策略都定义在主题上
Partition并行与顺序的基本单位分区内有序,跨分区无序
Offset分区内的消息编号删除消息不会改变已有编号
Broker一个 Kafka 服务节点集群里由 Controller 协调元数据
Replica / ISR分区副本与同步副本集合ISR 收缩是保护动作,抖动才需要排查
Kafka 不是传统意义上的队列:消息被消费后不会立刻删除,删除只由保留时间或保留容量触发。把这一点搞反,会导致「消费了为什么还能重放」的疑问反复出现。
把 Kafka 当日志库长期存储需要先算清磁盘成本:数据量 × 副本数 ÷ 压缩率 × 保留天数就是实际占用,副本数常被忽略。

易错点

  • 把 Kafka 当传统队列用,假设消息消费后就消失:实际按保留期保留,重放与重复消费都需要下游能承受
  • 单集群跨机房部署:跨机房写会放大延迟,多机房一般用镜像同步或双活方案,而不是把一个集群铺开
  • 忽略副本数对磁盘的放大效应,按单副本容量做规划,上线后发现磁盘用量是预估的三倍
  • 把主题分区数设得过小,消费并行度被锁死,只能事后扩容且无法回退

数据来源与参考

  • Apache Kafka 官方文档:Introduction 与 Design
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌