Apache kafka 为多个分区使用kafka批处理

Apache kafka 为多个分区使用kafka批处理,apache-kafka,kafka-consumer-api,kafka-partition,Apache Kafka,Kafka Consumer Api,Kafka Partition,我知道卡夫卡可以批量拉事件。 我试图理解这种情况: 一个主题有4个分区 我有一个消费者,卡夫卡将所有4个分区分配给它 假设Kafka客户端从Kafka中提取的每个批处理都有5条消息 我试图理解的是,如果一个批处理中的事件都来自同一个分区,然后循环到下一个分区批处理。或者批处理本身已经包含来自不同分区的事件了吗?我不能给你一个精确的答案,但我发现它非常有趣,可以进行测试 为此,我创建了一个具有四个分区的主题,并使用kafka producer perf test命令行工具在主题中生成一些消息。

我知道卡夫卡可以批量拉事件。 我试图理解这种情况:

  • 一个主题有4个分区
  • 我有一个消费者,卡夫卡将所有4个分区分配给它
  • 假设Kafka客户端从Kafka中提取的每个批处理都有5条消息

我试图理解的是,如果一个批处理中的事件都来自同一个分区,然后循环到下一个分区批处理。或者批处理本身已经包含来自不同分区的事件了吗?

我不能给你一个精确的答案,但我发现它非常有趣,可以进行测试

为此,我创建了一个具有四个分区的主题,并使用
kafka producer perf test
命令行工具在主题中生成一些消息。由于性能测试工具根本不会创建任何键,因此消息以循环方式写入主题分区

kafka-producer-perf-test --topic test --num-records 1337 --throughput -1 --record-size 128 --producer-props key.serializer=org.apache.kafka.common.serialization.StringSerializer --producer-props value.serializer=org.apache.kafka.common.serialization.StringSerializer --producer-props bootstrap.servers=localhost:9092
之后,我创建了一个简单的卡夫卡消费者,使用配置
max\u poll\u records=5
来匹配您的问题。消费者只需打印出所消费的每条消息的偏移量和分区:

Integer counter = 0;

// consume messages with `poll` call and print out results
try(KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(settings)) {
    consumer.subscribe(Arrays.asList(topic));
    while (true) {
        System.out.printf("Batch = %d\n", counter);
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
        for (ConsumerRecord<String, String> record : records) {
            System.out.printf("offset = %d, partition = %d\n", record.offset(), record.partition());
        }
        counter += 1;
    }
}

这基本上意味着没有任何东西,正如您所说,它只是“尝试”从单个分区中尽可能多地提取,这很好,尽管实际上我们可能不应该依赖于批处理中的内容。另外,很高兴知道我们有这个pref工具:)也许它与性能有关,每个批都有多个分区没有意义,因为它涉及多个RTT。
Batch = 0
offset = 310, partition = 0
offset = 311, partition = 0
offset = 312, partition = 0
offset = 313, partition = 0
offset = 314, partition = 0

Batch = 1
offset = 315, partition = 0
offset = 316, partition = 0
offset = 317, partition = 0
offset = 318, partition = 0
offset = 319, partition = 0

# only offsets with partition 0

Batch = 45
offset = 525, partition = 0
offset = 526, partition = 0
offset = 527, partition = 0
offset = 528, partition = 0
offset = 529, partition = 0
Batch = 46
offset = 728, partition = 1
offset = 729, partition = 1
offset = 730, partition = 1
offset = 731, partition = 1
offset = 732, partition = 1

# only offsets with partition 1

Batch = 86
offset = 928, partition = 1
offset = 929, partition = 1
offset = 930, partition = 1
offset = 931, partition = 1
offset = 932, partition = 1
Batch = 87
offset = 465, partition = 2
offset = 466, partition = 2
offset = 933, partition = 1
offset = 934, partition = 1
offset = 935, partition = 1
Batch = 88
offset = 467, partition = 2
offset = 468, partition = 2
offset = 469, partition = 2
offset = 470, partition = 2
offset = 471, partition = 2

## and so on