RoundRobinAssignor的分区分配策略不同于Range,RoundRobin 针对集群中所有Topic而言。
RoundRobin 轮询分区策略,是把所有的 partition 和所有的 consumer 都列出来,然后按照 hashcode 进行排序,最后通过轮询算法来分配 partition 给到各个消费者。
例如存在一个topic(可以是多个)中有7个 partition ,一个消费组中有3个 consumer ,Kafka会将所有的 partition 在排序后,以轮询的方式分配给每个 consumer。
首先对默认的分区分配策略进行修改,默认的分区分配策略是 Range
// 设置分区分配策略
properties.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,"org.apache.kafka.clients.consumer.RoundRobinAssignor");
同样将三个 consumer 启动起来,并由 生产者进程发送500数据
// 创建kafka生产者对象
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
// 发送数据
for (int i = 0; i < 500; i++) {
kafkaProducer.send(new ProducerRecord<>("first", "peace" + i), new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
if (exception == null) {
System.out.println("主题: " + metadata.topic() + " 分区: " + metadata.partition());
}
}
});
Thread.sleep(1);
}
kafkaProducer.close();
可以看到 consumer 0 接收的是 2 和 5 分区的数据
可以看到 consumer 1 接收的是 0、3 和 6 分区的数据
可以看到 consumer 2 接收的是 1 和 4 分区的数据
不难看出 Kafka是将7个分区的数据以轮询的方式分配给3个 consumer