44 lines
1.4 KiB
Java
44 lines
1.4 KiB
Java
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<PartitionInfo> 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<String, ?> map) {
|
||
}
|
||
}
|