跳到主要内容

10、Kafka 实战 - Kafka消费者工作流程

1 Kafka消费方式

1、 pull(拉)模式:消费者从broker中主动拉取数据。(Kafka中使用)
不足:如果Kafka中没有数据,消费者可能会陷入循环,一直返回空数据。
2、 push(推)模式:Kafka中不适用此种方式,因为broker决定消息发送速率,很难适应所有消费者的消费速度。
 

2 Kafka消费者工作流程

2.1 消费者总体工作流程

1、 生产者向分区中的每个Leader发送一批批的数据。

2、 Follower主动与Leader同步数据,保证数据的可靠性。

3、 消费者可以消费某一个分区的数据,一个消费者也可以消费多个分区的数据,消费者与消费者之间是完全独立的。

4、 每一个分区的数据只能由消费者组中的一个消费者进行消费。(把消费者组当成一个独立的消费者,同一个分区不能由同一个消费者组里面两个及以上的消费者消费)

5、 消费到哪里的具体位置为offset,offset保存在系统主题_consumer_offsets中。(Kafka的底层数据是持久化到磁盘上)
 

2.2 消费者组原理

Consumer Group(CG):消费者组,由多个consumer组成。形成一个消费者组的条件,是所有消费者的groupid相同。
1、 消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费。
2、 消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
3、 如果向消费组中的消费者数超过主题分区数量,则有一部分消费者就会闲置,不会接收任何消息。

coordinator:辅助实现消费者组的初始化和分区的分配。
coordinator节点选择 = groupid(写代码时手动给的)的hashcode值 % 50(consumer_offsets的分区数量)
例如:groupid的hashcode值 = 1,1% 50 = 1,那么 consumer_offsets 主题的1号分区,在哪个broker上,就选择这个节点的coordinator作为这个消费者组的老大。消费者组下的所有的消费者提交offset的时候就往这个分区去提交offset。

消费者组初始化流程

(0)生产者把数据发送到Kafka集群,选择节点的coordinator。

1、 每个消费者都往选出的coordinator发送请求,表示要加入到组当中。

2、 coordinator会从消费者中选出一个消费者作为Leader。

3、 coordinator会把收集到的所有topic信息都发送给消费者的Leader。

4、 Leader制定消费方案。

5、 制定计划后,Leader将消费方案发给coordinator。

6、 coordinator把消费方案下发给各个消费者。

7、 每个消费者会定期给coordinator发送心跳反应(默认3s),**一旦超时(session.timeout.ms=45s)则该消费者会被移除并触发再平衡,别的消费者继续完成接下来的任务;或消费者处理消息的时间过长(max.poil.interval.ms=5分钟)**也会触发再平衡。
 

消费者组详细消费流程

1、 消费者组创建消费者网络连接客户端,主要用于与Kafka集群进行交会。

2、 消费者调用sendFetches方法用于抓取数据的初始化。

3、 消费者网络连接客户端调用send方法发送请求。

4、 Leader通过回调方法onSuccess把数据拉取到消息队列里。

5、 消费者一次拉取一批次数据,经过反序列化、拦截器再进行数据处理。
 

2.3 消费者重要参数