int numPartitionsPerConsumer = numPartitionsForTopic / consumersForTopic.size();
int consumersWithExtraPartition = numPartitionsForTopic % consumersForTopic.size();
List<TopicPartition> partitions = AbstractPartitionAssignor.partitions(topic, numPartitionsForTopic);
for (int i = 0, n = consumersForTopic.size(); i < n; i++) {
int start = numPartitionsPerConsumer * i + Math.min(i, consumersWithExtraPartition);
int length = numPartitionsPerConsumer + (i + 1 > consumersWithExtraPartition ? 0 : 1);
assignment.get(consumersForTopic.get(i).memberId).addAll(partitions.subList(start, start + length));
}
利用除数和余数得到结果
比如5个分区,3个消费者
分区:01234
消费:
01
23
4
public class KafkaPartitionTest {
public static void main(String[] args) {
int numPartitionsForTopic = 5;
int consumersForTopicSize = 3;
int numPartitionsPerConsumer = numPartitionsForTopic / consumersForTopicSize;
int consumersWithExtraPartition = numPartitionsForTopic % consumersForTopicSize;
//List<TopicPartition> partitions = AbstractPartitionAssignor.partitions(topic, numPartitionsForTopic);
for (int i = 0, n = consumersForTopicSize; i < n; i++) {
int start = numPartitionsPerConsumer * i + Math.min(i, consumersWithExtraPartition);
int length = numPartitionsPerConsumer + (i + 1 > consumersWithExtraPartition ? 0 : 1);
//assignment.get(consumersForTopic.get(i).memberId).addAll(partitions.subList(start, start + length));
System.out.println("start:" + start);
System.out.println("start + length:" + (start + length));
}
}
}