第 3 / 19 篇

第 2 章 用核心概念搭好地图

生产者、主题和消费者

生产者(Producer)负责写入,例如订单服务。主题(Topic)是一类记录的逻辑集合,例如 orders。消费者(Consumer)负责读取,例如通知服务。Kafka 服务进程称为 Broker,一个集群通常有多个 Broker。

生产者把记录交给主题,而不是直接指定“发给某个消费者”。消费者可以暂时离线,之后再读取仍然保留的数据。

分区和偏移量

主题可以拆成多个分区(Partition)。每个分区是一条独立的追加日志。记录在某个分区里的位置叫偏移量(Offset)。

orders
  分区 0:offset 0 → offset 1 → offset 2
  分区 1:offset 0 → offset 1
  分区 2:offset 0 → offset 1 → offset 2 → offset 3

“分区 0 的 offset 2”和“分区 2 的 offset 2”是不同记录。偏移量只在同一分区内有意义,也不应被当作精确的业务消息计数:压缩、事务和日志管理都可能让可见记录的位置有空洞。

Kafka 保证的是分区内的日志顺序,不是整个多分区主题的全局顺序。即使使用同一分区,消费者把任务交给多个线程后,也可能自行打乱完成顺序。

Key 和消费者组

一条记录通常包含 Key、Value、时间戳,也可以带 Headers。Key 可以是订单号,Value 可以是 JSON。固定分区数量、固定分区策略的前提下,同一个 Key 通常进入同一个分区,因此适合把同一订单的状态变化放在一起。增加分区或改变分区策略后,历史与新记录的映射可能变化。

消费者组(Consumer Group)是一组协作的消费者,使用相同的 group.id。同一组里,一个分区在稳定分配时交给一个消费者负责;不同组各自维护进度,都能独立读取同一份记录。

记住一句话:组内分工,组间独立。 三个分区、四个组内消费者,通常最多三个消费者同时获得分区;多出来的一个没有分区可读。

副本

副本(Replica)是分区数据的复制。普通分区有一个 Leader 负责写入,Follower 从 Leader 复制。Leader 故障后,满足条件的副本可以接替。副本数和分区数不是同一个概念:三个分区、每分区三个副本,总计九份分区副本。

本章自测:两个业务都要完整读到订单,该用同一个组吗?不该。使用不同组;同一个组意味着协作分担。