如果我提供自定义分区程序,KafkaTemplate的send(Topic,Key,Message)方法将调用Partition方法吗?

时间:2019-09-04 13:17:32

标签: spring-kafka

我想知道kafkaTemplate.send(topic,key,message)方法是否会调用提供的自定义分区程序partition()方法吗?

1 个答案:

答案 0 :(得分:0)

嗯,KafkaTemplate完全基于Apache Kafka客户端Producer。最终代码如下:

producer.send(producerRecord, buildCallback(producerRecord, producer, future));

keytopic实际上是该ProducerRecord的一部分。 其他所有操作都在KafkaProducer和其他Kafka Client对象中完成。 特别是Partitioner.partition()KafkaProducer中被调用:

 /**
     * computes partition for given record.
     * if the record has partition returns the value otherwise
     * calls configured partitioner class to compute the partition.
     */
    private int partition(ProducerRecord<K, V> record, byte[] serializedKey, byte[] serializedValue, Cluster cluster) {
        Integer partition = record.partition();
        return partition != null ?
                partition :
                partitioner.partition(
                        record.topic(), record.key(), serializedKey, record.value(), serializedValue, cluster);
    }

这是private Future<RecordMetadata> doSend(ProducerRecord<K, V> record, Callback callback) {的一部分,从提到的KafkaTemplate.doSend()调用。

您可以考虑改用此API:

/**
 * Send the data to the provided topic with the provided key and partition.
 * @param topic the topic.
 * @param partition the partition.
 * @param timestamp the timestamp of the record.
 * @param key the key.
 * @param data the data.
 * @return a Future for the {@link SendResult}.
 * @since 1.3
 */
ListenableFuture<SendResult<K, V>> send(String topic, Integer partition, Long timestamp, K key, V data);

因此,您也可以完全控制partition

但不久之后:KafkaTemplate没有呼叫Partitioner.partition()

另一方面:为什么不在您的项目中尝试呢?您甚至可能没有这样的问题来找我们...