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)消费者一次拉取一批次数据,经过反序列化、拦截器再进行数据处理。