package com.durant.kafka.config; import org.apache.kafka.clients.producer.Partitioner; import org.apache.kafka.common.Cluster; import org.apache.kafka.common.PartitionInfo; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /** * @author:fst * @date:2023/11/25 * @aim:自定义分区器 */ @Component public class MyPartitioner implements Partitioner { /** * 自定义kafka分区主要解决用户分区数据倾斜问题 提高并发效率(假设 3 分区) * @param topic 消息队列名 * @param key 用户传入key * @param keyBytes key字节数组 * @param value 用户传入value * @param valueBytes value字节数组 * @param cluster 当前kafka节点数 * @return 如果3个分区,返回 0 1 2 */ public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { //获取topic的partitions信息 List partitionInfos = cluster.partitionsForTopic(topic); int partitionsNum = partitionInfos.size(); // 这里以 key 的哈希值作为分区选择依据 System.out.println("================================"); System.out.println(Math.abs(key.hashCode()) % partitionsNum); return Math.abs(key.hashCode()) % partitionsNum; } public void close() { } public void configure(Map map) { } }