1. Introduction

  • partitioner是决定将特定消息分配给(assign to)哪个分区的过程;

2. Partitioner Key Nonnull

  • Key Hashing是确定Key到分区的Mapping的过程;

  • 在默认的Kafka分区器中,使用murmur2算法对Key进行Hash;

targetPartition = Math.abs(Utils.murmur2(keyByte)) % (numPartition - 1)
  • 即相同的Key将转到相同的分区,且将分区添加到主题将完全改变公式;

  • 最好不要覆盖partitioner的行为,但也可使用partitioner.class来覆盖;

PartitionerKeyNonNull

3. Partitioner Key Null

  • 当Key为空,生产者将有不同的默认partitioner;

Entry Memo

Round Robin Partitioner

Kafka ≤ 2.3

Sticky Partitioner

Kafka ≥ 2.4

  • Sticky Partitioner提高生产者的性能,尤其在高吞吐场景下,
    especially with high throughput;

4. Round Robin Partitioner

RoundRobinPartitioner
  • 对Kafka ≤ 2.3,当没分区,也没指定Key时,
    默认的partitioner会以round-robin fashion发送数据;

  • 这会导致更多的批次(batch,每个分区一个批次)和更小的批次(想象下100个分区);

  • 这是个问题,因较小的批会导致更多的请求和更高的延迟latency;

5. Sticky Partitioner

StickyPartitioner
  • 性能目标(goal)是将所有记录发送到单个分区,而非多个分区,以改进批处理;

  • producer sticky partitioner将:

    • 粘贴到分区,直到批次已满或linger.ms消逝;
      stick to partition until batch full or linger.ms elapse;

    • 发送批次后,更改分区为sticky;

  • 这将导致更大的批次和更低延迟latency,因有更大请求,且更可能达到batch.size,

  • 随时间推移,记录仍均匀分布在分区中,因集群的平衡(balance)不会受到影响;
    still spread evenly across partition;

6. Performance

PartitionerLatencyA
PartitionerLatencyB