
1.新建类CustomPartitioner

package com.imooc.kafkastudy;
import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;
import org.apache.kafka.common.PartitionInfo;
import org.apache.kafka.common.record.InvalidRecordException;
import org.apache.kafka.common.utils.Utils;
import java.util.List;
import java.util.Map;
public class CustomPartitioner implements Partitioner {
@Override
public int partition(String topic,
Object key, byte[] keyBytes,
Object value, byte[] valueBytes,
Cluster cluster) {
List<PartitionInfo> partitionInfos = cluster.partitionsForTopic(topic);
int numPartitions = partitionInfos.size();
if (null == keyBytes || !(key instanceof String)) {
throw new InvalidRecordException("kafka message must have key");
}
if (numPartitions == 1) {
return 0;
}
if (key.equals("name")) {
return numPartitions - 1;
}
return Math.abs(Utils.murmur2(keyBytes)) % (numPartitions - 1);
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> map) {
}
}
2.在MyProducer中添加


会发送到不同的分区
本文介绍了一个名为CustomPartitioner的自定义Kafka分区器,该分区器确保特定键(如name)的消息会被定向发送到特定分区。如果主题只有一个分区,消息将发送到0号分区。其他情况下,根据键的哈希值计算分区。这个分区器旨在提高消息处理的可控性和效率。
803

被折叠的 条评论
为什么被折叠?



