您的位置:首页 > 其它

Kafka消费者组原理剖析

2021-12-25 13:37 393 查看

消费者组(Consumer Group)是什么

Consumer Group 是kafka提供的可扩展且具有容错性的消费者机制,消费者组内有多个消费者,它们被同一个ID所标识,这个ID被称为Group ID,组内所有的消费者通过协调机制一起消费订阅主题的分区,每个分区只能由一个消费者实例去消费。

消费者组解决了什么问题

我们知道消息中间件通常有两种引擎模型,点对点模型和发布/订阅模型。 点对点模型的消息一旦被消费就会从队列中删除,而且消息只能被一个消费者消费,这种模型典型的缺点是伸缩性比较差。而发布/订阅模型要求每个消费者订阅主题的所有分区,这种做法伸缩性也不好。Kafka消费者组很好的解决了上述两种模型伸缩性差的问题。如果kafka所有消费者实例都属于同一个Group那么它实现的就是点对点模型,如果所有消费者实例分别属于不同的Group那么它实现的就是发布/订阅模型。在消费者组中,理想状态下,**消费者实例的数量应当与消费者组订阅主题的分区总数。**假设一个 Consumer Group 订阅了 3 个主题,分别是 A、B、C,它们的分区数依次是 1、2、3,那么通常情况下,为该 Group 设置 6 个 Consumer 实例是比较理想的情形,因为它能最大限度地实现高伸缩性。如果你设置了 8 个实例,那么很遗憾,有 2 个实例(8 – 6 = 2)将不会被分配任何分区,它们永远处于空闲状态。因此,在实际使用过程中一般不推荐设置大于总分区数的 Consumer 实例。设置多余的实例只会浪费资源,而没有任何好处。

消费者组Rebalance

Rebalance 本质上是一种协议,规定了一个 Consumer Group 下的所有 Consumer 如何达成一致,来分配订阅 Topic 的每个分区。比如某个 Group 下有 20 个 Consumer 实例,它订阅了一个具有 100 个分区的 Topic。正常情况下,Kafka 平均会为每个 Consumer 分配 5 个分区。这个分配的过程就叫 Rebalance。

消费者组出发Rebalance主要有以下三个条件:

  • 消费者组内消费者实例发生变化
  • 消费者组订阅的主题数量发生变更
  • 订阅主题的分区数发生变更

Rebalance 发生时,Group 下所有的 Consumer 实例都会协调在一起共同参与。你可能会问,每个 Consumer 实例怎么知道应该消费订阅主题的哪些分区呢?这就需要分配策略的协助了。

当前 Kafka 默认提供了 3 种分配策略,每种策略都有一定的优势和劣势,我们今天就不展开讨论了,你只需要记住社区会不断地完善这些策略,保证提供最公平的分配策略,即每个 Consumer 实例都能够得到较为平均的分区数。比如一个 Group 内有 10 个 Consumer 实例,要消费 100 个分区,理想的分配策略自然是每个实例平均得到 10 个分区。这就叫公平的分配策略。如果出现了严重的分配倾斜,势必会出现这种情况:有的实例会“闲死”,而有的实例则会“忙死”。

Rebalance会导致消费者组内的所有消费者实例都停止消费,知道Rebalance过程结束,因此应该尽量避免出现这种情况。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: