如何获取 Kafka 的消费者详情? —— 从 Scala 到 Java 的切换

Flink流计算编程--Kafka+Flink整合demo flink kafka 阅读详情

目标及实现

实现如同 bin/kafka-consumer-group.sh –describe –bootstrap-server localhost:9092 –group CONSUMER_GROUP_ID的效果:

[root@node2 kafka_2.12-1.0.0]# bin/kafka-consumer-groups.sh --describe --bootstrap-server localhost:9092 --group CONSUMER_GROUP_ID
TOPIC                PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG        CONSUMER-ID                                       HOST                   CLIENT-ID
topic-test1          0          1648            1648            0          CLIENT_ID-e2d41f8d-dbd2-4f0e-9239-efacb55c6261    /192.168.92.1          CLIENT_ID
topic-test1          1          1648            1648            0          CLIENT_ID-e2d41f8d-dbd2-4f0e-9239-efacb55c6261    /192.168.92.1          CLIENT_ID
topic-test1          2          1648            1648            0          CLIENT_ID-e2d41f8d-dbd2-4f0e-9239-efacb55c6261    /192.168.92.1          CLIENT_ID
topic-test1          3          1648            1648            0          CLIENT_ID-e2d41f8d-dbd2-4f0e-9239-efacb55c6261    /192.168.92.1          CLIENT_ID

KafkaConsumerGroupService的核心方法是CollectGroupAssignment,其方法参数为一个consumer group的groupId,方法输出为上面示例中的列表信息。CollectGroupAssignment方法主要有以下几个步骤:

  1. 根据groupId调用describeConsumerGroup方法(内部原理是发送DescribeGroupsRequest请求)来获取consumer group的基本信息,参考上面示例中的CONSUMER-ID、HOST、CLIENT-ID以及TopicPartition信息,但是没有CURRENT-OFFSET、LOG-END-OFFSET、LAG信息。注意这里的LOG-END-OFFSET是消费者可见的LEO,不是生产者可见的LEO,也就是通俗意义上的HW。
  2. 根据groupId调用listGroupOffsets方法(内部原理是发送OffsetFetchRequest请求)来获取各个分区(Partition)的对应的消费位移CURRENT-OFFSET。
  3. 通过调用KafkaConsumer的endOffsets方法来获取TopicPartition对应的HW,即示例中的LOG-END-OFFSET。
  4. 计算Lag并组合成信息列表List。
改造

对应Java版的KafkaConsumerGroupService改造代码可以参见代码,目录结构如下图所示:

其中model中的ConsumerGroupSummary、ConsumerSummary和PartitionAssignmentState是简单的JavaBean, PartitionAssignmentState是用来保存每个TopicPartition的消费者信息的,具体内容参考如下。KafkaConsumerGroupCustomService就是本文所要陈述的Java改造办的KafkaConsumerGroupSerivice,ConsumerGroupUtils用来存放一些公用的代码。

@Data
@Builder
public class PartitionAssignmentState {
    private String group; // groupId
    private Node coordinator; // consumer coodinator节点信息
    private String topic;
    private int partition;
    private long offset;
    private long lag;
    private String consumerId;
    private String host;
    private String clientId;
    private long logEndOffset;
}

初始化KafkaConsumerGroupCustomService需要Kafka的服务端地址,然后初始化AdminClient和KafkaConsumer,AdminClient中包含了众多管理类方法,主要是通过发送各种自定义协议请求来完成,上面步骤中所说的describeConsumerGroup和listGroupOffsets方法也是通过AdminClient来实现的;KafkaConsumer主要是用来获取TopicPartition对应的HW(消费者可见的LogEndOffsets)的。

KafkaConsumerGroupCustomService中与scala版对应的collectGroupAssignment方法如下(详细步骤参考代码注释):

public List<PartitionAssignmentState> collectGroupAssignment(
        AdminClient adminClient, KafkaConsumer<String, String> consumer,
        String group) {
    //1. 获取consumer group的基本信息,包括CONSUMER-ID、HOST、
    // CLIENT-ID以及TopicPartition信息
    AdminClient.ConsumerGroupSummary consumerGroupSummary
            = adminClient.describeConsumerGroup(group, 0);
    List<TopicPartition> assignedTopicPartitions = new ArrayList<>();
    List<PartitionAssignmentState> rowsWithConsumer = new ArrayList<>();
    scala.collection.immutable.List<AdminClient.ConsumerSummary> consumers
            = consumerGroupSummary.consumers().get();
    if (consumers != null) {
        //2. 获取各个分区(Partition)的对应的消费位移CURRENT-OFFSET
        scala.collection.immutable.Map<TopicPartition, Object> offsets
                = adminClient.listGroupOffsets(group);
        if (offsets.nonEmpty()) {
            String state = consumerGroupSummary.state();
            // 3. 还有一个状态是Dead表示"group"对应的consumer group不存在
            if (state.equals("Stable") || state.equals("Empty")
                    || state.equals("PreparingRebalance")
                    || state.equals("AwaitingSync")) {
                List<ConsumerSummary> consumerList = changeToJavaList(consumers);
                // 4. 获取当前有消费者的消费信息,即包含CONSUMER-ID、HOST、CLIENT-ID
                rowsWithConsumer = getRowsWithConsumer(consumerGroupSummary, offsets,
                        consumer, consumerList, assignedTopicPartitions, group);
            }
        }
        //5. 获取当前没有消费者的消费信息
        List<PartitionAssignmentState> rowsWithoutConsumer =
                getRowsWithoutConsumer(consumerGroupSummary,
                offsets, consumer, assignedTopicPartitions, group);
        //6. 合并结果
        rowsWithConsumer.addAll(rowsWithoutConsumer);
    }
    return rowsWithConsumer;
}

KafkaConsumerGroupCustomService类中包含有getRowsWithConsumer()、getRowsWithoutConsumer()、changeToJavaList等私有方法也都是在Scala语言与Java语言之间进行切换,这样可以不需要修改kafka-core的原生代码而通过外部的封装调用既可以实现获取Kafka消费者详情的功能。光看代码比较抽象,建议对此感兴趣的同学可以亲自对比一下kafka-core包中kafka.admin.ConsumerGroupCommand的KafkaConsumerGroupSerivice与笔者自定义的KafkaConsumerGroupCustomService的实现来了解下Scala语言到Java语言的转换。

如果需要打印详情可以调用KafkaConsumerGroupCustomService同目录的ConsumerGroupUtils类中的printPasList(List list)方法。注意要运行这些代码需要JDK8的环境,笔者为了让代码显得“骚气”一点就用来一点Java8的语法,如果需要Java7的代码实现可以关注私聊。

或许有些同学对于Scala和Java交叉的代码并不感冒,想要寻求一种存Java式的实现方式,那么在这里怎么实现呢?答案是通过KafkaAdminClient,它是AdminClient的Java版实现,从Kafka0.11.0.0版本开始引入的,不过KafkaAdminClient本身并没有提供describeConsumerGroup、listGroupOffsets之类的方法给我们直接使用,扩展一下也很方便,由于篇幅限制,这部分的内容将在下一篇文章中进行介绍,如果想要先一睹为快,可以参考下代码实现,详细的逻辑解析敬请期待….

Kafka查询以及删除消费者信息 kafka基础性操作 阅读详情

相关推荐

7.【kafka运维】 kafka-consumer-groups.sh消费者组管理

文章目录消费者组管理 kafka-consumer-groups.sh1. 查看消费者列表`--list`2. 查看消费者组详情`--describe`3. 删除消费者组`--delete`4. 重置消费组的偏移量 `--reset-offsets`5. 删除偏移量`delete-offsets`More 日常运维 、问题排查 怎么能够少了滴滴开源的 滴滴开源LogiKM一站式Kafka监控与管控平台 消费者组管理 kafka-consumer-groups.sh 1. 查看消费者列表--list s

石臻说AI(szzdzhp001) 【原名 石臻臻的杂货铺】 2万+

Kafka系列:查看Topic列表、消息消费情况、模拟生产者消费者

这条命令其实并不执行删除动作,仅仅是在zookeeper上标记该topic要被删除而已,同时也提醒用户一定要提前打开delete.topic.enable开关,否则删除动作是不会执行的。a)在server.properties中设置delete.topic.enable参数为ture。3.执行删除命令:rmr /brokers/topics/test。2.找到topic所在目录:ls /brokers/topics。执行topic删除命令时,出现提示。

YJ000312的博客 4万+

QT与Coin3D实现机器人的仿真

前言 Coin3D编程环境配置好后,开始下一步的机器人仿真任务。本文根据在研5轴机器人,完成三维模型生成与机器人的仿真。主要参考博主冯Jungle的博客,在此表示感谢。 ——2021.05.23 环境 Win10:VS2019、QT5.15.2、Coin3D、SolidWorks2016 机器人三维模型生成 目前广泛应用于因特网的VRML ( Virtual Reality Modeling Language,虚拟现实建模语言)为用户提供一种可参与的、并能对场景中对象主动做出反应的虚拟现实环境,现已成

焦露的博客 6908

Kafka:主题创建、分区修改查看、生产者、消费者

Kafka命令行主题创建、分区修改查看、生产者创建、消费者创建

qq_57697356的博客 5974

关于Nuttx操作系统

NuttX是一个成熟的实时操作系统

qq_28576837的博客 4092

全国职业院校技能大赛-大数据应用赛项-数据挖掘-01

-----------------------推荐Top5结果如下--------------------------------------------第一条数据前10列结果展示为:----------------------------------------相同种类前10的id结果展示为:--------------------相似度top5(商品id:14,平均相似度:0.522356)相似度top1(商品id:1,平均相似度:0.983456)若属于该spu_id,则内容为1否则为0。

Eternity_04的博客 1956

KafkaConsumer分析

一 重要的字段 String clientId:Consumer唯一标识 ConsumerCoordinator coordinator: 控制Consumer与服务器端GroupCoordinator之间的通信逻辑 Fetcher&lt;K, V&gt; fetcher: 负责从服务器端获取消息的组件,并且更新partition的offset ConsumerNetworkClient c...

Tybyqi的博客 665

OpenEuler内核编译及替换

一、内核源码下载 在gitee上下载OpenEuler内核源码 下载地址 选择需要的内核版本源码压缩包进行下载 二、内核编译 1.解压缩 将下载好的源码进行解压 tar xvf openeuler-kernel-4.19.90-2107.1.0.tar.gz 2.清理源代码树 解压后得到一个名为kernel的内核源码文件夹,进入后执行命令 make mrproper 清理过去内核编译产生的config,第一次编译时可不执行此命令 3.生成内核配置文件.config 先将将系统原配置文件拷贝过来,原

m0_56602092的博客 2万+

如何获取Kafka的消费者详情从Scala到Java的切换

原 如何获取Kafka的消费者详情——从Scala到Java的切换https://blog.youkuaiyun.com/u013256816/article/details/79968647版权声明:本文为博主原创文章,未经博主朱小厮允许不得转载。 https://blog.youkuaiyun.com/u013256816/article/details/79968647 欢迎支持笔者新作:《深入理解Kafka:核心...

rede 430

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 557

GMSL转eDP芯片MAX9686X(ADI)

MAX96860/MAX96862/MAX96864解串器可以把单路或双路GMSL转换成eDP V1.4a,支持820MHzPCLK的无压缩的24bpp(每个像素的位数)视频,或660MHz的30bpp视频。芯片的GMSL支持NRZ编码的6Gbps/187Mbps的GMSL2,PAM4编码的12Gbps/187Mbps的GMSL3。同时支持单线(COAX模式)双向全双工传输控制数据和video数据。支持DSC压缩的芯片,最大支持像素时钟1080MHz@24bpp或者864MHz@30bpp,传输方式包括同轴

qflook的博客 2851

大模型+MCP驱动PSCAD电磁暂态仿真自动化实践

在专业仿真软件与生成式AI协同的场景中,MCP这类标准化工具调用协议正成为连接大模型与工程软件的基础设施。其原理是把PSCAD中的工程读取、参数注入、仿真执行、日志诊断和结果解析封装为边界清晰的原子工具,由模型解析自然语言意图,代码负责任务状态、数值校验与批量执行。技术价值在于解耦需求描述与脚本实现,降低重复工况扫描的维护成本,并通过统一返回结构和参数白名单提升可追溯性。典型应用包括电磁暂态仿真的故障位置与电阻扫描、控制参数遍历、波形特征提取及报告汇总。围绕PowerMCP自建服务的完整复盘,展示了从工具面

weixin_33881140的博客 357

使用 Fargate 在 AWS ECS 上运行 Spring Boot 应用程序

本文介绍了使用AWS Fargate支持的ECS部署SpringBoot应用的完整流程。主要内容包括:1)将SpringBoot应用打包为Docker镜像并推送至ECR;2)创建任务定义配置CPU、内存和网络等参数;3)设置ECS服务管理任务运行;4)配置负载均衡器分配流量;5)设计VPC网络和安全组规则确保安全访问;6)使用SSM参数存储管理敏感信息。整个过程实现了无服务器化部署,既保持了应用控制权,又免除了基础设施管理负担,是扩展Web服务的可靠方案。

介绍AWS Azure GCP devops Terraform 等技术 513

如何获取Kafka的消费者详情——从Scala到Java的切换

前文摘要 在上一篇文章《Kafka的Lag计算误区及正确实现》中介绍了如何计算消费者的消费滞后量(Lag),并且讲解了如何调用Kafka的kafka.admin.ConsumerGroupCommand文件中的KafkaConsumerGroupService来发送OffsetRequest和OffsetFetchRequest两个请求,进而通过两个请求结果之间的差值来获得结果。不过如果你不想修...

朱小厮的博客 7006

开发具有情感分析能力的AI Agent

本文将深入探讨开发具有情感分析能力的AI Agent的各个方面。我们将首先介绍情感分析的基础知识,包括定义、背景和应用领域。接着,我们将详细讲解情感分析的核心概念、数据处理方法和算法原理。随后,文章将展示如何设计情感分析系统架构,并进行项目实战,包括环境安装、源代码实现和案例分析。最后,我们将总结最佳实践和注意事项,为读者提供进一步学习的资源。情感分析(Sentiment Analysis),也称为意见挖掘,是自然语言处理(NLP)的一个分支。

SuperAGI2025 1146

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

如何获取 Kafka 的消费者详情——从 Scala 到 Java 的切换万字详解

本文介绍了Kafka消费者监控系统的实现与从Scala到Java的迁移方案。主要内容包括:1)监控系统功能概述,涵盖消费进度、消费者状态和性能指标三大类监控指标;2)Scala实现部分,详细展示了消费者组信息获取、消费延迟计算等核心功能;3)完整的Scala到Java迁移指南,包括语言特性对比、环境配置和Java版本实现;4)高级特性如缓存优化、批量操作和指标导出;5)容器化部署方案。通过迁移,系统在保持原有功能基础上,获得了更好的Java生态集成、更强的类型安全性和更优的性能表现,同时降低了维护成本。

油墨香^-^的博客 512

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

基于hadoop的KAFKA安装,及测试java api

启动 Kafka 服务时,会。将/data/kafka3 目录下 kafkalib 文件夹中的所有 jar 包,拷贝到 Eclipse 中。http://172.16.103.12:60000/allfiles/kafka3/kafkalib.tar.gz 网址上下载。3.切换到/data/kafka1 目录下,将 kafka 的压缩包 kafka_2.10-0.8.2.2.tgz。11.调用/apps/kafka/bin 目录下 kafka-console-producer.sh,来生产一些消。

qq_63042830的博客 1100

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

kafka

Kafka是什么 Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目。 Kafka最初是由LinkedIn开发,并于2011年初开源。2012年10月从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。 Kafka是一个分布式消息队列:生产者、消费者的功能。它提供了类似于JMS的特...

Django的博客 2万+

Kafka 2.5.0发布——弃用对Scala2.11的支持

近日Kafka发布了最新版本 2.5.0,增加了很多新功能:下载地址:https://kafka.apache.org/downloads#2.5.0对TLS 1.3的支持(默认为1.2...

大数据流动 298

神马操作Kafka 竟宣布弃用 Java 8

Kafka 3.0.0 发布了:​编辑切换为居中添加图片注释,不超过 140 字(可选)主要更新如下:第一条就是宣布弃用对 Java 8 和 Scala 2.12 的支持!!!在 Kafka 3.0.0 中,Kafka 项目中的所有组件都已弃用对 Java 8、Scala 2.12 的支持,宣布弃用,但 3.0.0 还能用,这次宣布只是给用户一个调整的时间,到了 Kafka 4.0,Java 8、Scala 2.12 将将正式取消支持。

m0_63437643的博客 963

Kafka源码环境搭建完整指南

本文详细介绍了从零开始搭建Kafka源码开发环境的完整流程,包括环境准备(JDK、Scala、Gradle安装)、源码获取与版本选择、编译配置(镜像源设置)、源码编译与IDE项目生成、IntelliJ IDEA配置等关键步骤。特别提供了Windows和Linux系统下的操作指南,并针对国内用户给出了加速下载的解决方案。文章还包含Zookeeper配置、Kafka启动、Topic测试等实际运行环节,以及编译和运行过程中的常见问题解决方法。最后介绍了源码调试技巧,帮助开发者深入理解Kafka内部机制。整个过程强

油墨香^-^的博客 911

【Kafka学习】Kafka-2.7 源码编译阅读

Kafka 2.7 Idea源码编译阅读

qq_34926773的博客 2129
上一篇: 一文搞定HashMap的实现原理和面试
下一篇: Kafka 的 Lag 计算误区及正确实现
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值