Kafka消费者组原理剖析
消费者组(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过程结束,因此应该尽量避免出现这种情况。
- 【备忘】Kafka原理剖析及实战演练视频教程下载
- kafka原理和实践(四)spring-kafka消费者源码
- 插曲:Kafka的生产者案例和消费者原理解析
- kafka原理和实践(四)spring-kafka消费者源码
- Kafka架构和原理深度剖析
- Kafka底层原理剖析(近万字建议收藏)
- Kafka幂等性原理及实现剖析
- Kafka原理+安装+Linux命令及Java代码分别模拟实现生产者消费者+整合Spark Streaming+自主管理偏移量Offset-Redis/Mysql
- Kafka幂等性原理及实现剖析
- EventBus的使用和原理剖析
- vue实现数据双向绑定原理剖析
- 记一次Kafka消费者拉取数据不均匀问题
- 深入剖析MapReduce架构及原理(二)
- JavaBean内省的简单操作,剖析JavaBean属性设置的原理。。
- Tomcat集群Cluster实现原理剖析
- Kafka 的这些原理你知道吗
- Objective-C内存管理教程和原理剖析(一)(autorelease与release)
- 最通俗的CRC校验原理剖析
- 【转】iPhone/Mac Objective-C内存管理教程和原理剖析(四)系统自动创建新的autorelease pool
- 深入剖析 mybatis 原理(三)如何整合Spring