kafka自定义分区器
1、需求:不同的项目可以根据不同业务逻辑发送到不同的分区,下面写一个简单Demo。如果发送消息包含kafka就发送到分区1,否则发送到分区0;
2、实现步骤
1)定义类实现partitioner接口
2)重写partition()方法
public class PartitionerUtil implements Partitioner {
@Override
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
String msgValue = value.toString();
//create partition
int partition;
//partition included or not
if(msgValue.contains("kafka")){
partition = 0;
}else{
partition = 1;
}
return partition;
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> map) {
}
}
3)发送消息
public class KafkaProducer5 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
Properties properties = new Properties();
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"101.43.232.28:9092");
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
//配置自定义分区器
properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, "com.kafka.utils.PartitionerUtil");
KafkaProducer<String,String> kafkaProducer = new KafkaProducer<String, String>(properties);
for(int i=0;i<10;i++){
kafkaProducer.send(new ProducerRecord<>("first", "kafka" + i), new Callback() {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if(null == e){
System.out.println("partition="+recordMetadata.partition());
}else{
System.out.println(e.getMessage());
}
}
});
}
kafkaProducer.close();
}
}

浙公网安备 33010602011771号