Skip to main content

Kafka 分区策略

简单来说:有 Key 就用 Key 哈希,没 Key 就用轮询(或粘性)。这是 Kafka 默认分区器 (DefaultPartitioner) 的核心逻辑。

在更具体的业务场景下,选择哪种策略,主要取决于你对消息顺序性负载均衡的权衡。

为了帮你更清晰地理解,我将这两种策略的核心区别整理成了下表:

特性Key 哈希 (Key-Hashing)轮询 (Round-Robin)
触发条件消息指定了 Key消息未指定 Key(Key 为 null)
核心逻辑对 Key 进行哈希计算(如 Murmur2),然后对分区数取模将消息依次、循环地分配到所有可用分区上
主要优点保证相同 Key 的消息有序,满足业务逻辑负载绝对均衡,能最大程度避免数据倾斜
主要缺点若 Key 分布不均,可能导致热点分区(数据倾斜),影响整体吞吐无法保证任何顺序性,因为消息被分散到不同分区
适用场景强顺序性要求:如订单状态更新、用户行为轨迹追踪,需确保同一订单或用户的消息按顺序处理无顺序要求的大流量场景:如海量日志采集、监控指标数据上报,首要目标是均匀写入

⚠️ 注意事项

  • 版本差异:在 Kafka 2.4 版本之前,无 Key 消息默认使用纯粹的轮询策略。但从 2.4 版本开始,默认行为已升级为性能更优的粘性分区策略 (Sticky Partitioner)。它会在一个分区内"粘"着发送一批消息,直到批次填满再切换,以提升批处理效率。但它在负载均衡方面的表现与轮询策略类似。
  • 自定义策略:如果上述策略都无法满足你的复杂业务需求(如按消息中的地域信息分区),你可以通过实现 Partitioner 接口来创建自定义分区策略

总而言之,选择哪种策略的核心依据是业务是否要求消息的顺序性

  • 需要保证顺序 → 使用 Key 哈希
  • 不需要保证顺序 → 使用 轮询(或粘性)策略

如果你对如何自定义分区器,或者对"粘性分区"的具体工作原理感兴趣,我们可以继续探讨。