自定义分区器
研发人员可以根据企业需求,自己重新实现分区器
(1)需求
假如我们实现一个分区器,发送过来的数据中包含某个beijing,就发发往0号分区,不包含beijing 就发往 1号分区
自定义分区器代码
public class MyCustomPartitioner implements Partitioner {
@Override
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
String msgValues = value.toString();
int partition;
if (msgValues.contains("beijing")) {
partition = 0;
} else {
partition = 1;
}
return partition;
}
@Override
public void close() {}
@Override
public void configure(Map<String, ?> map) {}
}
自定义分区器代码测试
/**
* kafka生产者-自定义分区
*/
public class CustomKafkaProviderByMyPartitioner {
public static void main(String[] args) {
// 配置
Properties properties = new Properties();
//连接kafka broker
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost: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.itorange.kafka.custom.MyCustomPartitioner");
//创建kafka 生产者对象
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
// 发送数据
for (int i = 0; i < 4; i++) {
kafkaProducer.send(new ProducerRecord<>("quickstart-events", "record-beijing:" + i), (recordMetadata, exception) -> {
if (exception == null) {
System.out.println("主题:" + recordMetadata.topic() + ".分区:" + recordMetadata.partition());
}
});
}
// 关闭数据
kafkaProducer.close();
}
}