消费分区
资料来源于网络
消费者订阅的入口:KafkaConsumer#subscribe
消费者消费的入口:KafkaConsumer#poll
处理流程:
对元数据重平衡处理:KafkaConsumer#updateAssignmentMetadataIfNeeded
协调器的拉取处理:onsumerCoordinator#poll
执行已完成的【消费进度】提交请求的回调函数:invokeCompletedOffsetCommitCallbacks()重平衡之前提交自己当前消费的信息:
更新发送心跳相关的时间:pollHeartbeat
确保消费者组活跃:AbstractCoordinator#ensureActiveGroup
是否需要加入组:joinGroupIfNeeded(timer);
发送入组请求:initiateJoinGroup、AbstractCoordinator#sendJoinGroupRequest
处理入组响应:JoinGroupResponseHandler
入组成功,自己被选为分配分区的 leader:AbstractCoordinator#onJoinComplete
重新分配分区:AbstractPartitionAssignor#performAssignment,AbstractPartitionAssignor.assign
拉取消息:
拉取消息:org.apache.kafka.clients.consumer.KafkaConsumer#pollForFetches
本地拉取:fetcher.collectFetch()
远程拉取:sendFetches();、client.poll
拦截返回:interceptors.onConsume
重平衡
作用是让组内所有的消费者知道自己应该消费那个分区或者它可以不用消费分区,或者消费多个分区,都是由重平衡机制来保证的。
也就是相当于是消费者的管家,给他派发消费那个分区的任务。
这下面这些时刻会触发:
- 组员变化:加入,退出,闪退
- 主题数量变化
- 主题分区数变化
要想实现消费者的重平衡势必要和broker进行通信,在Kafka中是通过心跳机制来实现的,平衡的步骤:
- JoinGroup
在发送请求的时候:
请求当broker 告诉broker我要消费那个主题,并且协调器会收到以后会放入队列。
当所以的消费者都发送JoinGroup以后,这个时候所有信息已经收集到协调者,然后协调者来选一个leader。
协调者的响应:
协调者会选一个leader一般是先发起JoinGroup的消费者,这个时候协调器会告诉这个消费者去进行分区方案的生成。
- SyncGroup
在发送请求的是时候有下面这两种情况:
1 如果是leader 将分配好的方案给到协调器。
2 如果是非leader 只是要就协调者告诉自己应该消费那些分区。
协调者响应:
告诉消费者消费那些分区
图片源于网络