kafka坑之三:获取元数据

由于kafka版本的关系(详见坑二),在获取kafka元数据时新旧版本也产生了差别。

0.10.0版本中,ZkConsumerGroupService、KafkaConsumerGroupService是ConsumerGroupService的子类,kafka源码在执行时能够根据ConsumerGroupCommandOptions(程序配置)自动区分要实例化哪个类。

dfcb8627b18d6659b6243bb03e1bb8a1.png

然后执行describeGroup()方法,

22027f17dadc5cb7cf11b113aa60eee4.png

根据实例化的类调用对应的collectGroupAssignment():

05c5c8d88ad35d3bcdd9ff4b6e23a949.png

通过adminClient.describeConsumerGroup()、adminClient.listGroupOffsets()、describePartition()获取基本信息、各个分区的消费位移、水位线(HW,但此时被称为LOG-END-OFFSET,详见坑一)

根据groupid获取主题等基本信息

11dcfae9dcbd4127a34575e8c697e215.png

获取分区消费位移

63ea30897b5d187e80bb9738309e8d33.png

获取LOG-END-OFFSET

3283fe68b6dfa75c78bdea8b06e006b4.png

最后通过collectConsumerAssignment()计算合成List<PartitionAssignmentState>,而describeGroup()直接返回一个val (state, assignments),最后由printOffsets格式化输出。

ZkConsumerGroupService和KafkaConsumerGroupService的不同之处在于发送请求时的request不同,本质流程是一样的。

因此在0.10.0版本中,使用ZkConsumerGroupService或KafkaConsumerGroupService的describeGroup()即可获得元数据。

44051e0c09d85e318c881b238e13e519.png


但在2.1.0及以后的计算版本中,kafka源码只使用Kafka的describeGroup()方法,且describeGroup()不再有返回值。由于不再区分是Zk还是Kafka,也就没有了collectGroupAssignment()方法,取而代之的是collectGroupOffsets():

获取基本信息

963a739f8a90b0786e28882c9c5bcc8c.png

获取分区的消费位移

d26ff9d2057d903afb076bf41eeedc93.png

通过collectConsumerAssignment()合成List<PartitionAssignmentState>

520143041a9ce775723ccdef8e5772d6.png

最后由printOffsets格式化输出。

因此在2.1.0版本中,需要使用consumerGroupService.collectGroupOffsets()获取元数据。

024c32cba93b007730a5a5ebec77cce9.png

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值