Java Kafka Producer将消息发布到单个分区
我是卡夫卡的新手,正在查阅现有的官方文件 在我的本地系统中,我启动了一个kafka实例和zookeeper。Zookeper和kafka服务器都在默认端口上运行 我创建了一个主题“test”,复制因子为1,因为我只有一个kafka实例正在运行 除此之外,我还创建了两个分区 我在同一消费者组中有两个消费者订阅了此队列 现在,我已经在windows机器上使用命令提示符启动了消费者 当我从命令提示符启动producer并将消息发布到主题时,一切正常。Kafka使用循环将消息推送到两个分区,每个使用者交替地接收消息,因为每个使用者都在侦听单独的分区 但是,当我使用JavaKafka客户机jar创建生产者时,即使我对消息使用不同的键,生产者也会将所有消息推送到同一分区,因为所有消息都是在同一消费者上接收的 分区也不是静态的,每次我运行producer时它都会不断变化 我尝试过同样的场景,从命令提示符启动一个生产者,其配置与我使用java代码提供给kafka客户端生产者的配置完全相同。命令提示符生成器似乎工作正常,但代码生成器正在将所有消息推送到同一分区 我尝试过更改某些消息的密钥,希望代理将其发送到不同的分区,因为文档中提到代理使用message的密钥路由消息Java Kafka Producer将消息发布到单个分区,java,apache-kafka,kafka-producer-api,Java,Apache Kafka,Kafka Producer Api,我是卡夫卡的新手,正在查阅现有的官方文件 在我的本地系统中,我启动了一个kafka实例和zookeeper。Zookeper和kafka服务器都在默认端口上运行 我创建了一个主题“test”,复制因子为1,因为我只有一个kafka实例正在运行 除此之外,我还创建了两个分区 我在同一消费者组中有两个消费者订阅了此队列 现在,我已经在windows机器上使用命令提示符启动了消费者 当我从命令提示符启动producer并将消息发布到主题时,一切正常。Kafka使用循环将消息推送到两个分区,每个使用者交
public class KafkaProducerParallel {
public static void main(String[] args) throws InterruptedException,
ExecutionException {
Properties properties = new Properties();
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
"localhost:9092");
properties.put(ProducerConfig.CLIENT_ID_CONFIG, "parallelism-
producer");
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
StringSerializer.class);
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
LongSerializer.class);
Producer<String, Long> parallelProducer = new KafkaProducer<>
(properties);
for(long i=0;i<100;i++) {
ProducerRecord<String, Long> producerRecord;
if(i<50) {
producerRecord = new ProducerRecord<String,
Long>("second-topic", "Amoeba", i);
}else {
producerRecord = new ProducerRecord<String,
Long>("second-topic", "Bacteria", i);
}
RecordMetadata recordMetadata =
parallelProducer.send(producerRecord).get();
System.out.printf("Sent record : with key %s and value
%d to partition %s", producerRecord.key(), producerRecord.value(),
recordMetadata.partition());
System.out.println();
}
parallelProducer.close();
}
}
一切正常 在KafkaProducer使用的分区器(用于确定分区)中,为两个键计算相同的分区:
阿米巴虫
,细菌
。默认情况下,KafkaProducer使用org.apache.kafka.clients.producer.internals.DefaultPartitioner
建议:更改键或增加分区数
注意:生产者决定将消息放在哪个分区,而不是代理。将代码从
Producer-Producer=new-KafkaProducer
致:
KafkaProducer生产者=新的KafkaProducer
默认情况下,接口实现将数据放在同一分区中。因此,请使用
KafkaProducer
而不是简单的生产者您也可以分享错误吗message@harkeshkumar控制台中没有错误。我只是好奇为什么它总是将记录发送到同一个服务器partition@harkeshkumar我已经用代码的示例控制台输出更新了这个问题您是否只有这两个键?它们进入同一分区的几率为50%。尝试50个不同的键,它们应该随机分布。如果你没有任何键,它将随机分布在分区之间。如果您有一个键,它将使用该键分配分区。
Sent record : with key Amoeba and value 0 to partition 1
Sent record : with key Amoeba and value 1 to partition 1
Sent record : with key Amoeba and value 2 to partition 1
Sent record : with key Amoeba and value 3 to partition 1
Sent record : with key Amoeba and value 4 to partition 1
Sent record : with key Amoeba and value 5 to partition 1
Sent record : with key Amoeba and value 6 to partition 1
Sent record : with key Amoeba and value 7 to partition 1
Sent record : with key Amoeba and value 8 to partition 1
Sent record : with key Amoeba and value 9 to partition 1
Sent record : with key Amoeba and value 10 to partition 1
Sent record : with key Amoeba and value 11 to partition 1
Sent record : with key Amoeba and value 12 to partition 1
Sent record : with key Amoeba and value 13 to partition 1
Sent record : with key Bacteria and value 87 to partition 1
Sent record : with key Bacteria and value 88 to partition 1
Sent record : with key Bacteria and value 89 to partition 1
Sent record : with key Bacteria and value 90 to partition 1
Sent record : with key Bacteria and value 91 to partition 1
Sent record : with key Bacteria and value 92 to partition 1
Sent record : with key Bacteria and value 93 to partition 1
Sent record : with key Bacteria and value 94 to partition 1
Sent record : with key Bacteria and value 95 to partition 1
Sent record : with key Bacteria and value 96 to partition 1
Sent record : with key Bacteria and value 97 to partition 1
Sent record : with key Bacteria and value 98 to partition 1
Sent record : with key Bacteria and value 99 to partition 1
KafkaProducer<String, String> producer = new KafkaProducer<String, String>