• 消息队列-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 只是要就协调者告诉自己应该消费那些分区。
      协调者响应:
      告诉消费者消费那些分区
      图片源于网络
      在这里插入图片描述
  • 相关阅读:
    企业计算机服务器中了_locked勒索病毒怎么办,_locked勒索病毒解密数据恢复
    SparkSQL 总结
    【JS】react antd 项目如何让Table组件表格滚动播放
    vue3.2学习笔记
    Python吴恩达深度学习作业3 - 1层隐藏层的神经网络
    SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法
    mysql之主从复制和读写分离搭建
    P2181 对角线
    哈希及哈希表的实现
    短视频/直播+教育成为教育新常态
  • 原文地址:https://blog.csdn.net/qq_43259860/article/details/136548046