Apache kafka 通过键将kafka中的消息推送到不同的分区

Apache kafka 通过键将kafka中的消息推送到不同的分区,apache-kafka,kafka-producer-api,kafka-python,Apache Kafka,Kafka Producer Api,Kafka Python,我有一个Kafka主题(测试主题),有3个分区,还有一组消息,其中包含一个只能接受3种类型值的键,我希望这些消息根据它们的值转到不同的分区 from kafka import KafkaProducer from kafka.partitioner import DefaultPartitioner messages = [{"partition_key":"k1", "x":1}, {"partition_key":"k2", "x":2},

我有一个Kafka主题(测试主题),有3个分区,还有一组消息,其中包含一个只能接受3种类型值的键,我希望这些消息根据它们的值转到不同的分区

from kafka import KafkaProducer
from kafka.partitioner import DefaultPartitioner

messages = [{"partition_key":"k1", "x":1},
            {"partition_key":"k2", "x":2},
            {"partition_key":"k3", "x":3},
            {"partition_key":"k1", "x":4},
            {"partition_key":"k2", "x":5}]

partitioner = DefaultPartitioner()
all_partitions = list(range(100))
available = all_partitions
dataPartitioner = partitioner(b'partition_key', all_partitions, available)

producer = KafkaProducer(bootstrap_servers="localhost:9092", value_serializer=lambda v: json.dumps(v).encode('utf-8'), partitioner = dataPartitioner)

for m in messages:
  producer.send('test-topic', m)
producer.flush()

在上面的代码中,我希望其partition\u key值相同的消息进入同一分区。

您需要编写接口的自定义实现,并在初始化时将该类交给
KafkaProducer

例如:

 private static Properties createProducerConfig(String brokers) {
    Properties props = new Properties();
    props.put("bootstrap.servers", brokers);
    //more properties
    props.put("partitioner.class","com.app.KafkaUserCustomPatitioner");
    return props;
    }