1:生产者分区器
1:DefaultPartitioner默认分区器
如果producer没指定落地到指定partition中,Kafak通过默认的分区器对数据进行partition,默认的分区的规则是对key进行hash取值 % 分区数, 相同的key会分布到同一分区中。如果没指定key,则就按照轮询算法将消息均匀的分布在主题的可用分区上。
/**
*
* 自定义分区器
*/
public class DefaultPartitioner implements Partitioner {
/**
* 线程安全topic计数器容器
*/
private final ConcurrentMap<String, AtomicInteger> topicCounterMap = new ConcurrentHashMap<>();
/**
* 获取配置定义属性
* @param configs
*/
@Override
public void configure(Map<String, ?> configs) {}
/**
* 核心分区方法
*/
@Override
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
//获取该topic下partition
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
int numPartitions = partitions.size();
if (keyBytes == null) {
//没有指定key的话 按照轮询算法来算出partit