2. Partitioner Key Nonnull
-
Key Hashing是确定Key到分区的Mapping的过程;
-
在默认的Kafka分区器中,使用murmur2算法对Key进行Hash;
targetPartition = Math.abs(Utils.murmur2(keyByte)) % (numPartition - 1)
-
即相同的Key将转到相同的分区,且将分区添加到主题将完全改变公式;
-
最好不要覆盖partitioner的行为,但也可使用partitioner.class来覆盖;
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
-
对Kafka ≤ 2.3,当没分区,也没指定Key时,
默认的partitioner会以round-robin fashion发送数据; -
这会导致更多的批次(batch,每个分区一个批次)和更小的批次(想象下100个分区);
-
这是个问题,因较小的批会导致更多的请求和更高的延迟latency;
5. Sticky Partitioner
-
性能目标(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;