客户端可以控制将消息发送到哪个分区
Kafka默认分区机制(org.apache.kafka.clients.producer.internals.DefaultPartitioner):
如果记录中指定了分区,则直接使用
如果未指定分区,但指定了key值,则根据key的hash值选择一个分区(相同的key所发送到的Partition是同一个,可用来保证消息的局部有序性)
如果未指定分区,也未指定key值,则以 '黏性分区' 策略(2.4版本以前使用轮询策略)选择一个分区
分区策略
轮询策略(org.apache.kafka.clients.producer.RoundRobinPartitioner)
如果key值为null,并且使用了默认的分区器,Kafka会根据轮训(Random Robin)策略将消息均匀地分布到各个分区上。
散列策略(Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions)
如果键值不为null,并且使用了默认的分区器,Kafka会对键进行散列,然后根据散列值把消息映射到对应的分区上
黏性分区策略(org.apache.kafka.clients.producer.UniformStickyPartitioner)
很多时候消息是没有指定Key的。而Kafka 2.4之前的策略是轮询策略,这种策略在使用中性能比较低。所以2.4中版本加入了黏性分区策略(Sticky Partitioning Strategy)。
黏性分区器(Sticky Partitioner)主要思路是选择单个分区发送所有无Key的消息。一旦这个分区的batch已满或处于“已完成”状态,黏性分区器会随机地选择另一个分区并会尽可能地坚持使用该分区——象黏住这个分区一样
自定义策略
默认分区器是使用次数最多的分区器。除了散列分区之外,用户可以根据需要对数据使用不一样的分区策略
实现org.apache.kafka.clients.producer.Partitioner接口,在配置中设置实现的类prop.put("partitioner.class", 实现类);
标签: 分区、黏性、kafka、clients、未指定、面试
-
2021-04-12 21:43:56
1楼#1层
-
指定了key,按照key进行哈希,相同key去一个partition。
-
没有指定key,round-robin来选partition
-