当前位置: 首页 > news >正文

Kafka-消费者-KafkaConsumer分析-PartitionAssignor

Leader消费者在收到JoinGroupResponse后,会按照其中指定的分区分配策略进行分区分配,每个分区分配策略就是一个PartitionAssignor接口的实现。图是PartitionAssignor的继承结构及其中的组件。

在这里插入图片描述
PartitionAssignor接口中定义了Assignment和Subscription两个内部类。

进行分区分配需要的两方面的数据:Metadata中记录的集群元数据和每个Member的订阅信息。

为了用户增强对分配结果的控制,就将用户订阅信息和一些影响分配的用户自定义信息封装成Subscription,例如,“用户自定义数据”可以是每个消费者的权重。

其中,topics集合表示某Member订阅的Topic集合,userData表示用户自定义的数据。

PartitionAssignor接口提供了subscription方法,用于添加用户自定义数据,在创建JoinGroupRequest的时候会用到subscription()方法。

Assignment中保存了分区的分配结果,partitions表示的是分配给某消费者的TopicPartition集合,userData是用户自定义的数据。

再来看看PartitionAssignor的其他方法,assign是子类要实现的、完成Parition分配的抽象方法。

onAssignment()方法是在每个消费者收到Leader分配结果时的回调函数,此调用发生在解析SyncGroupResponse之后。

AbstractPartitionAssignor为了简化PartitionAssignor接口的实现,对assign()方法进行了实现,其中会将Subscription中的userData去除掉后,再进行分区分配。具体代码如下:

在这里插入图片描述
RangeAssignor和RoundRobinAssignor都是Kafka提供的PartitionAssignor接口的默认实现。

  • RangeAssignor实现原理是:针对每个Topic,n=分区数/消费者数量,m=分区数%消费者数量,前m个消费者每个分配n+1个分区,后面的(消费者数量-m)个消费者每个分配n个Partition。
  • RoundRobinAssignor原理是:将所有Topic的Partition按照字典序排列,然后对每个Consumer进行轮询分配。
    举个例子,有C0、C1两个消费者和t0、t1两个Topic,每个Topic有三个分区编号都是0~2。使用RangeAssignor的分配结果是:C0:[t0p0,t0p1,t1p0,t1p1],C1:[t0p2,t1p2];使用RoundRobinAssignor的分配结果是:C0:[t0p0,t0p2,t1p1]、C1:[t0p1,t1p0,t1p2]。

相关文章:

  • 如何手写一个RPC?
  • rust跟我学三:文件时间属性获得方法
  • MySQL三大日志
  • 编写RedisUtil来操作Redis
  • Java中的finally字句
  • 006.Oracle事务处理
  • python爬虫如何写,有哪些成功爬取的案例
  • pytest -- 进阶使用详解
  • iproute 随手记
  • Spring Boot程序的打包与运行:构建高效部署流程
  • HarmonyOS—开发环境诊断的功能
  • MybatisPlus框架入门级理解
  • 安捷伦N5244A网络分析仪43.5GHz
  • 【PHP】PHP利用ffmreg获取音频、视频的详细信息
  • tomcat与servlet
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • conda常用的命令
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS函数式编程 数组部分风格 ES6版
  • Otto开发初探——微服务依赖管理新利器
  • REST架构的思考
  • SQLServer之创建数据库快照
  • Vue组件定义
  • 从零搭建Koa2 Server
  • 第十八天-企业应用架构模式-基本模式
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 欢迎参加第二届中国游戏开发者大会
  • 入口文件开始,分析Vue源码实现
  • 小程序01:wepy框架整合iview webapp UI
  • 最简单的无缝轮播
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • No resource identifier found for attribute,RxJava之zip操作符
  • const的用法,特别是用在函数前面与后面的区别
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • !$boo在php中什么意思,php前戏
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #include
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (BFS)hdoj2377-Bus Pass
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (七)c52学习之旅-中断
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转)EOS中账户、钱包和密钥的关系
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .net Application的目录
  • .Net Web项目创建比较不错的参考文章
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .Net中间语言BeforeFieldInit
  • @Autowired和@Resource装配
  • @Not - Empty-Null-Blank