Consumer Group是Kafka提供的可扩展且具有容错性的消费者机制。
Consumer Group有以下三个特性:
- Consumer Group可以有一个或多个Consumer实例。
- Group ID表示唯一的一个Consumer Group,其是一个字符串。
- Consumer Group下所有实例订阅的topic的单个分区,只能分配给组内的某个Consumer实例消费。这个分区也可以被其他Group消费。
传统消息引擎有两种模型:点对点模型和发布/订阅模型。前者的特性是消息一旦被消费,就会从队列中被删除,且只能被下游的一个Consumer消费,这样造成的问题是伸缩性不高。后者允许消息被多个Consumer消费,但是其伸缩性也不高,因为每个订阅者都必须要订阅主题的所有分区。
Kafka使用Consumer Group实现了两种模型:如果所有实例都属于同一个Group,那么它实现的就是消息队列模型;如果分别属于不同模型,那么实现的就是发布/订阅模型。
一个Group下该有多少个Consumer实例?
理想情况下,Consumer实例的数量应该等于该Group订阅topic的分区数量。
Consumer Group如何管理位移?
消费者在消费过程中需要记录消费了多少数据,即Offset。对于Consumer Group来说,它是一组KV对,Key是分区,V对应Consumer消费该分区的最新位移。
新旧版本的Consumer Group管理位移方式不同
老版本是把位移保存在Zookeeper中。但是Zookeeper不适合进行频繁的写更新,而Consumer Group的位移更新时一个非常频繁的操作,这会极大拖慢Zookeeper的性能。
所以在新版本中,重新设计为将offset保存在Kafka内部主题的方法,也就是__consumer_offsets。
Consumer Group的重平衡(Rebalance)
Rebalance本质上是一种协议,规定了一个Consumer Group下的所有Consumer如何达成一致,来分配订阅Topic的每个分区。
Rebalance的触发条件有三个:
- 组成员数发生变更。
- 订阅主题数发生变更。
- 订阅主题的分区数发生变更。
Rebalance对Consumer Group消费过程的影响
Rebalance过程中,所有Consumer实例都会停止消费,等待Rebalance完成。
网友评论