• 消息队列-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 只是要就协调者告诉自己应该消费那些分区。
      协调者响应:
      告诉消费者消费那些分区
      图片源于网络
      在这里插入图片描述
  • 相关阅读:
    02【Java的IO模型】
    linux安装nacos
    企业架构相关
    开源软件的利弊
    Vue实现增删改查——基于SpringBoot和Vue的后台管理系统项目系列博客(九)
    No Monotone Triples
    AtCoder Beginner Contest 278 G.Generalized Subtraction Game(思维题/博弈 multi-sg)
    vue2使用百度地图标记点弹出框添加背景图并且根据数据动态切换
    Cesium 展示——根据文件中的 count 对加载的每个实体赋予不同的颜色
    MySQL——读写分离
  • 原文地址:https://blog.csdn.net/qq_43259860/article/details/136548046