消息队列-Kafka-消费方如何分区与分区重平衡

消费分区

资料来源于网络

消费者订阅的入口: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 只是要就协调者告诉自己应该消费那些分区。
    协调者响应:
    告诉消费者消费那些分区
    图片源于网络
相关推荐
szephyr13 小时前
消息队列入门:RabbitMQ 和 Kafka 到底怎么选,什么时候不该用
后端·架构·kafka·消息队列·rabbitmq
hey you~2 天前
云客服会话数据实时同步,数据库架构怎么设计?
消息队列·数据库架构·高可用·实时同步·最终一致性·云客服·会话数据
A.说学逗唱的Coke2 天前
【大模型专题】别再用 HTTP 直连 Agent 了:用 Kafka 承载 A2A 协议,从 PoC 走到生产
人工智能·kafka·a2a
用户531397318172 天前
[Kafka源码揭秘] 消息写入全链路:网络IO与请求入队
kafka·消息队列
swordbob2 天前
一个 Partition就是一个年级,一个消费者组占用1年级1班,另一个消费者组占用1年级2班,座位号(offset)可以相同,但班级号不同?
kafka
香吧香2 天前
Kafka 三节点集群:只订阅一个 broker 会丢消息吗?能用 VIP订阅 吗?
kafka
雾隐隐o2 天前
Kafka 生产者消息丢失:ACK、重试与可靠发送
kafka
heimeiyingwang3 天前
【中台·技术篇】消息队列中台:Kafka/RocketMQ 统一管理与多租户隔离
kafka·rocketmq·中台
程序员天天困3 天前
Kafka 接入 AI 的三条路线:MCP 提案、会话记忆与实时上下文
大数据·后端·kafka
hey you~4 天前
云客服多渠道统一接入,消息队列技术实现方案
kafka·消息队列·rocketmq·系统集成·云客服·多渠道接入·接口对接