如果我在消息类producerRecord中定义了分区,或者设置了value,但我又配置了自定义的分区器,那此时会优先使用哪种分区策略呢?还有默认分区器会在什么时候用上呢,默认不是会粘性分区吗?
如果我在消息类producerRecord中定义了分区,或者设置了value,但我又配置了自定义的分区器,那此时会优先使用哪种分区策略呢?还有默认分区器会在什么时候用上呢,默认不是会粘性分区吗?
收起
消息经过序列化之后就需要确定它发往的分区,如果消息ProducerRecord中指定了partition字段,那么就不需要分区器的作用,因为partition代表的就是所要发往的分区号。如果消息ProducerRecord中没有指定partition字段,那么就需要依赖分区器,根据key这个字段来计算partition的值。分区器的作用就是为消息分配分区。
Kafka中提供的默认分区器是org.apache.kafka.clients.producer.internals.DefaultPartitioner, 它实现了org.apache.kafka.clients.producer.Partitioner接口。
除了使用Kafka提供的默认分区器进行分区分配,还可以使用自定义的分区器,只需同 DefaultPartitioner 一样实现Partitioner接口即可。默认分区器在 key为null 时不会选择非可用的分区,我们可以通过自定义的分区器打破这一限制。实现了自定义的分区器后需要通过配置参数 partition.class来显式指定这个分区器。示例如下:
properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, DemoPartitioner.class.getName());
如果我消息指定了分区,但我又配置了自定义分区器,此时会报错吗?还是不会报错,然后优先选择消息中指定的分区?
报告相同问题?