首页/数据/数据工程与 ETL 速查/Partition 分区与顺序性
Kafka64 条

Partition 分区与顺序性

分区是 Kafka 的并行与顺序单位:同一分区内消息严格有序,跨分区不保证顺序;分区分布在多个 Broker 上以实现吞吐与容错。

Partition 分区是什么

分区是 Kafka 里并行与顺序的基本单位:一个主题被拆成若干分区,分区分散在不同 Broker 上,生产与消费都以分区为单位并行。分区内消息严格按追加顺序排列,跨分区不保证任何顺序关系。扩容吞吐的手段就是增加分区。

分区键决定顺序边界

生产者未指定键时,消息按黏性策略分布到各分区;指定键后,同一个键的消息固定落入同一个分区(哈希取模)。因此「同一业务实体的事件必须有序」的需求,实现方式就是把业务主键作为消息键,让它们排在同一条队列里。

基本信息

作用并行读写与水平扩展的基本单位
顺序性分区内按写入顺序追加,跨分区无序
消费并行一个分区同一时刻只被消费组内一个成员消费
副本每分区有一个 Leader 与若干 Follower,分布在不同的 Broker
扩容分区数只能增加不能减少,增加会打乱既有键的分区归属

describe 输出逐列读法

列含义正常/异常
Topic主题名与预期一致
Partition分区编号,从 0 开始连续出现断号说明元数据异常
Leader当前处理读写的 Broker 编号为 -1 或 none 表示该分区不可用
Replicas副本所在 Broker 列表数量等于副本因子
Isr与 Leader 保持同步的副本集合短于 Replicas 说明有副本掉队

典型使用场景

  • 提高吞吐:分区数决定消费并行度的上限,扩容时增加 Broker 与分区
  • 保证顺序:按订单号、用户号分区,让同一实体的变更落在同一分区
  • 隔离流量:把不同业务或不同优先级的消息拆到不同主题与分区
  • 检查副本健康:describe 观察 Isr 是否持续短于 Replicas
  • 容量与负载均衡:确认各分区的 Leader 在 Broker 间分布均匀

查看分区分布与副本状态

查看分区分布与副本状态
# 逐分区打印 Leader、副本与 ISR
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders
# Topic: orders  Partition: 0  Leader: 2  Replicas: 2,3,1  Isr: 2,3,1
# Topic: orders  Partition: 1  Leader: 3  Replicas: 3,1,2  Isr: 3,1     ← 2 号副本未同步

# 只列出有副本掉队的分区,巡检用
kafka-topics.sh --bootstrap-server localhost:9092 --describe --under-replicated-partitions

生产时指定分区键

生产时指定分区键
# 用业务键作为消息键,同一键的消息固定进入同一分区,从而保证局部有序
# Java 客户端
producer.send(new ProducerRecord<String, String>("orders", order.getOrderId(), json));

# 命令行验证键与分区的对应关系
kafka-console-producer.sh --bootstrap-server localhost:9092 --topic orders \
  --property parse.key=true --property key.separator=:
消费者数量超过分区数后,多出来的实例不会被分配任何分区,只会空转。判断「要不要加消费者」之前,先确认分区数是否够用。
增加分区会改变键到分区的映射:既有键的消息可能落到与之前不同的分区,跨扩容点的顺序性会被打破。有严格有序要求的主题,宁可一次建足分区。

易错点

  • 分区数就是消费并行度的上限,消费者比分区多时多余实例空转,扩容前先核对分区数
  • 跨分区做聚合(例如按主题求和)需要下游自行处理乱序与完整性,不能假设全局有序
  • 扩容分区后继续假设「同一键永远在同一分区」,跨扩容点的顺序不再成立,需要按业务容忍度评估
  • 热点键集中在一个分区:消息量远高于其他分区,消费出现长尾,需要重新设计分区键或拆分热点

数据来源与参考

  • Apache Kafka 官方文档:Topics and Partitions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌