Kafka消费者的分区分配策略主要有以下几种,分别决定了如何将多个分区分配给消费者:
1. Range(范围分配)
- 描述:将分区连续地分配给消费者。每个消费者负责一段连续的分区。如果有多个消费者,那么消费者会按照顺序被分配一段连续的分区。
- 适用场景:适用于消费者之间的数据量差异较小,且需要连续消费的场景。
举例:假设有 6 个分区(P0, P1, P2, P3, P4, P5),2 个消费者:
- 消费者 1 负责分区 P0, P1, P2
- 消费者 2 负责分区 P3, P4, P5
2. Round Robin(轮询分配)
- 描述:按照消费者的数量,将分区轮流分配给消费者。每个消费者依次分配一个分区,直到所有分区被分配完。
- 适用场景:适用于分区数和消费者数不一定相等,且希望均衡负载的场景。
举例:假设有 6 个分区(P0, P1, P2, P3, P4, P5),2 个消费者:
- 消费者 1 负责分区 P0, P2, P4
- 消费者 2 负责分区 P1, P3, P5
3. Sticky(粘性分配)
- 描述:该策略是 Kafka 2.4+ 引入的,旨在尽量保持消费者与分区的映射关系不变,即尽量在重新平衡时保持消费者之前的分区分配。
- 适用场景:适用于希望减少消费者分配变动,稳定消费者与分区关系的场景。
举例:假设有 6 个分区和 3 个消费者,最初的分配可能是:
- 消费者 1 负责分区 P0, P1
- 消费者 2 负责分区 P2, P3
- 消费者 3 负责分区 P4, P5
如果有消费者退出或加入,粘性分配策略会尽量让已经分配的消费者保持其原有分配,尽量减少重新分配的次数。
4. Custom(自定义分配器)
- 描述:Kafka 允许用户自定义分配器,通过实现
org.apache.kafka.clients.consumer.ConsumerPartitionAssignor
接口,开发者可以根据自己的业务需求来实现分配逻辑。 - 适用场景:当默认的分配策略无法满足特定需求时,开发者可以自定义分配逻辑。
默认分配策略
在 Kafka 2.x 及之后版本中,默认的消费者分区分配策略是 Range
。这意味着,当消费者组中的消费者加入时,Kafka 会采用“范围分配”方式将分区分配给消费者,尽量确保每个消费者分配到一段连续的分区。