这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
消费者组是什么
消费者组(Consumer Group)是 Kafka 的重要特性之一,简而言之,消费者组就是让若干个消费者实例(Consumer Instance)形成一个消费者组,共同消费共同消费同一个或者多个 Topic 的不同 Partition 中的消息,注意,每一个 Partition 只能由消费者组中的一个 Consumer 来消费。
多个消费者组之间是相互独立的,它们可以订阅同样的主题进行消费。
消费者组如何工作
当一个消费者组订阅了一个或者多个 Topic 的时候,这些 Topic 中所有的 Partition 会被「分配」给消费者组中的消费者实例,这些消费者实例各自处理自己分配到的分区的消息。
前面介绍过,一个分区只能分配给一个消费者实例,不能被多个实例同时消费,同时,一个实例可能被分配多个分区。
举一个具体的例子。假设一个消费者组订阅了 T1、T2、T3 三个 Topic,他们中分别有3个、5个、10个分区,加起来一共18个分区。此时:
- 如果消费者组中正好有18个实例,那么,每个实例负责消费一个分区的消息。
- 如果消费者组中的实例数超过了总的分区数,比如有20个实例,那么将会有2个实例是空闲的,什么都不做,除非有其他实例挂掉触发 Rebalance。
- 如果消费者组中有 6 个实例,那么每个实例会被分配3个分区。
因此,推荐消费者组中的实例数与订阅的 Topic 的总分区数相同。
Rebalance
上一部分提到了 Rebalance 机制,它是 Kafka 中将消息分区分配给消费者组中的消费者实例的机制。上面的例子中,将 18 个分区分配给 6 个消费者实例的过程,就是 Rebalance。除了在消费者组订阅 Topic 后需要进行这样的分配,还有一些情况会触发 Relalance:
- 消费者组中的实例发生变化的时候,包括但不限于个别消费者实例宕机、有新的实例加入、有实例被踢出等等情况。此时,因为有些分区对应的消费者实例不在组中了,或者有新的实例可以「分担」其他实例的工作,那么,此时会触发 Rebalance。
- 订阅的主题发生变更的时候。因为消费者组可以通过匹配表达式来订阅主题,比如,订阅所有以
abc
开头的主题。当有新的主题被创建,如果这个主题的名称是以abc
开头的,那么,消费者组会自动消费这个主题,此时,就需要重新分配分区和消费者实例的关系。 - 主题的分区发生变化的时候,无论分区数增多还是减少,都需要重新分配消费者实例,以达到均衡。
当以上因素出现的时候,Rebalance 机制能都实现自动并且尽可能均衡的分配,但是,目前它还有一些问题。
第一,当执行 Relalance 的时候,消费者组中所有消费者实例都会停止对消息的消费,知道 Rebalance 工作完成。这类似于垃圾回收器中经常会提到了 stop-the-world
,因此,要尽可能避免频繁地 Rebalance。
第二,目前的 Rebalance 操作十分「不智能」,每次 Rebalance 操作都会将所有的分区进行重新分配,而不是采取尽量减少变动的方式,这一问题导致在分区数和消费者实例数比较多的情况下, Rebalance 操作是一个耗时的操作,因此,再次建议,要尽可能避免频繁地 Rebalance。
本文转载自: 掘金