首页 > 解决方案 > 有没有办法在不使用 Message 键的情况下将消息发布到 kafka 中的特定分区?

问题描述

我有数百万条记录,每条记录都有唯一标识符。

所有记录都按序列号分类,假设有 10k 条记录属于 series-1,另外 10k 条记录属于 series-2,依此类推。

现在我想将所有系列 1 记录发布到分区 1,所有系列 2 到分区 2 等等..

为此,我不想使用消息键,还有其他选择吗?

我是kafka的新手,如果问题有误或没有正确的细节,请纠正我?

标签: apache-kafka

解决方案


您可以使用以下方法在特定分区上发布消息

简单的 Kafka 生产者

/**
Creates a record to be sent to a specified topic and partition
**/
    public ProducerRecord(String topic, Integer partition, K key, V value) {
            this(topic, partition, null, key, value, null);
    }

在分区上发布消息的基本示例

        Properties properties = new Properties();
        properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, <bootstrap server detail>);
        properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

        //Define partition based on condition series-1 to 2 series-2 to 2
        int partition=getPartitionOnCondition.....
        String topic=""..

        Producer<String, String> producer = new KafkaProducer<String,String>(
                properties);
        ProducerRecord<String, String> record = new ProducerRecord<String, String>(topic, partition, key, value);

        producer.send(record);

自定义分区器

您还可以将自定义分区器用于生产者或流分区器

https://kafka.apache.org/documentation.html

自定义流分区器(如果您使用的是 Kafka Stream)

如果您使用的是 Kafka Stream。它还提供了一种在 Kafka Stream https://kafka.apache.org/23/javadoc/org/apache/kafka/streams/processor/StreamPartitioner.html周围启用自定义分区器的方法


推荐阅读