Kafka学习笔记: Kafka 的消费者组

Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制。

既然是一个组,那么组内必然可以有多个消费者或消费者实例(Consumer Instance),它们共享一个公共的 ID,这个 ID 被称为 Group ID。

组内的所有消费者协调在一起来消费订阅主题(Subscribed Topics)的所有分区(Partition)。

每个分区只能由同一个消费者组内的一个 Consumer 实例来消费。

Consumer Group特性

1.Consumer Group 下可以有一个或多个 Consumer 实例。这里的实例可以是一个单独的进程,也可以是同一进程下的线程。在实际场景中,使用进程更为常见一些。

2.Group ID 是一个字符串,在一个 Kafka 集群中,它标识唯一的一个 Consumer Group。

3.Consumer Group 下所有实例订阅的主题的单个分区,只能分配给组内的某个 Consumer 实例消费。这个分区当然也可以被其他的 Group 消费。

当 Consumer Group 订阅了多个主题后,组内的每个实例不要求一定要订阅主题的所有分区,它只会消费部分分区中的消息。

Consumer Group 之间彼此独立,互不影响,它们能够订阅相同的一组主题而互不干涉。

 

Kafka 仅仅使用 Consumer Group 这一种机制,却同时实现了传统消息引擎系统的两大模型:如果所有实例都属于同一个 Group,那么它实现的就是消息队列模型;如果所有实例分别属于不同的 Group,那么它实现的就是发布 / 订阅模型

理想情况下,Consumer 实例的数量应该等于该 Group 订阅主题的分区总数。

假设一个 Consumer Group 订阅了 3 个主题,分别是 A、B、C,它们的分区数依次是 1、2、3,

那么通常情况下,为该 Group 设置 6 个 Consumer 实例是比较理想的情形,因为它能最大限度地实现高伸缩性。

在实际使用过程中一般不推荐设置大于总分区数的 Consumer 实例。设置多余的实例只会浪费资源,而没有任何好处。

针对 Consumer Group,Kafka 是怎么管理位移的呢?

消费者在消费的过程中需要记录自己消费了多少数据,即消费位置信息。

在 Kafka 中,这个位置信息有个专门的术语:位移(Offset)。

看上去该 Offset 就是一个数值而已,其实对于 Consumer Group 而言,它是一组 KV 对,Key 是分区,V 对应 Consumer 消费该分区的最新位移。如果用 Java 来表示的话,大致可以认为是这样的数据结构,即 Map<TopicPartition, Long>,其中 TopicPartition 表示一个分区,而 Long 表示位移的类型。 [待验证...]

老版本的 Consumer Group 把位移保存在 ZooKeeper 中。

ZooKeeper 这类元框架其实并不适合进行频繁的写更新,而 Consumer Group 的位移更新却是一个非常频繁的操作。这种大吞吐量的写操作会极大地拖慢 ZooKeeper 集群的性能.

新版本的 Consumer Group 将位移保存在 Broker 端的内部主题中。

Rebalance 本质上是一种协议,规定了一个 Consumer Group 下的所有 Consumer 如何达成一致,来分配订阅 Topic 的每个分区。

例如:

某个 Group 下有 20 个 Consumer 实例,它订阅了一个具有 100 个分区的 Topic。正常情况下,Kafka 平均会为每个 Consumer 分配 5 个分区。这个分配的过程就叫 Rebalance。

Rebalance 的触发条件

1.组成员数发生变更。比如有新的 Consumer 实例加入组或者离开组,网络中断,心跳中断 抑或是有 Consumer 实例崩溃被“踢出”组。

2.订阅主题数发生变更。Consumer Group 可以使用正则表达式的方式订阅主题,比如 consumer.subscribe(Pattern.compile(“t.*c”)) 就表明该 Group 订阅所有以字母 t 开头、字母 c 结尾的主题。在 Consumer Group 的运行过程中,你新创建了一个满足这样条件的主题,那么该 Group 就会发生 Rebalance。

3. 订阅主题的分区数发生变更。Kafka 当前只能允许增加一个主题的分区数。当分区数增加时,就会触发订阅该主题的所有 Group 开启 Rebalance。

Rebalance 发生时,Group 下所有的 Consumer 实例都会协调在一起共同参与。

Consumer Group 发生 Rebalance 的过程场景

假设目前某个 Consumer Group 下有两个 Consumer,比如 A 和 B,当第三个成员 C 加入时,Kafka 会触发 Rebalance,并根据默认的分配策略重新为 A、B 和 C 分配分区,如下图所示:

显然,Rebalance 之后的分配依然是公平的,即每个 Consumer 实例都获得了 2 个分区的消费权。

Rebalance劣势

1.  在 Rebalance 过程中,所有 Consumer 实例都会停止消费,等待 Rebalance 完成。 影响性能.

2.   目前 Rebalance 的设计是所有 Consumer 实例共同参与,全部重新分配所有分区。

3.   Rebalance 实在是太慢了。曾经,有个国外用户的 Group 内有几百个 Consumer 实例,成功 Rebalance 一次要几个小时!

引用:

Kafka核心技术与实战 - 胡夕

发布了295 篇原创文章 · 获赞 783 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/zhanglong_4444/article/details/103697939
今日推荐