当消费者要加入群组时,它会向担任群组协调器的broker发送一个JoinGroup请求。第一个加入群组的消费者将成为“群主”。群主从协调器那里获得群组的成员列表(列表中包含了所有最近发送过心跳的消费者,它们被认为是活跃的),并负责给每一个消费者分配分区。群主使用一个实现了PartitionAssignor接口的分类来决定哪些分区应该被分配给哪些消费者。
Kafka内置了两种分配分区的策略:
Rang:把主题的若干个连续分区分配给消费者。当分区数量无法被消费者数量整除时,先加入群组的消费者会分配到更多的分区。
RoundRobin:把主题的所有分区逐个分配给消费者。RoundRobin策略会给所有消费者分配相同数量的分区(或者最大就差一个分区)。
可以通过partion.assignment.strategy来配置,默认使用实现了Range策略的org.apach.kafka.clients.consumer.RangeAssignor,也可以指定org.apach.kafka.clients.consumer.RoundRobinAssignor,还可以使用自定义策略。
分配完毕后,群主会把分配情况列表发给群主协调器,协调器在把这些信息发给所有消费者。每个消费者只能看到自己的分配消息,只有群主知道群组里所有消费者的分配信息。这个过程会在每次再均衡时重复发生。