如何使用java获得kafka滞后

如何使用java获得kafka滞后,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我目前开发了一个代码,可以显示主题、分区和日志偏移量。但我目前一直在研究如何获得分区的延迟。我知道有一个kafka offset命令可以实现这个功能,但我需要的是一个java代码 publicstaticvoidmain(字符串[]args)引发异常{ System.out.println(“启动消费者”);最终属性props=新属性(); put(ConsumerConfig.KEY_反序列化程序_CLASS_CONFIG,StringDeserializer.CLASS.getName())

我目前开发了一个代码,可以显示主题、分区和日志偏移量。但我目前一直在研究如何获得分区的延迟。我知道有一个kafka offset命令可以实现这个功能,但我需要的是一个java代码

publicstaticvoidmain(字符串[]args)引发异常{
System.out.println(“启动消费者”);最终属性props=新属性();
put(ConsumerConfig.KEY_反序列化程序_CLASS_CONFIG,StringDeserializer.CLASS.getName());
put(ConsumerConfig.VALUE\u反序列化程序\u CLASS\u配置,StringDeserializer.CLASS.getName());
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG,“SASL_明文”);
put(ConsumerConfig.BOOTSTRAP\u SERVERS\u CONFIG,BOOTSTRAP\u SERVERS);
props.put(ConsumerConfig.GROUP\u ID\u CONFIG,GROUPID);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,“最新”);
put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,“false”);
//使用道具创建消费者。
最终消费者=新卡夫卡消费者(道具);
//订阅该主题。
int i=0;
ArrayList分区=新的ArrayList();

对于(i=0;i要再现
kafka消费群体
功能,您需要一个消费者和一个AdminClient实例

首先,使用AdminClient,您可以调用以检索特定组的主题分区列表和提交的偏移量

然后使用使用者获取这些分区的结束偏移量。您使用的方法效率低下,不需要分配和查找结束偏移量。您只需调用

这就足以再现屏幕截图中包含的数据了


kafka消费者组
还用于打印分配给每个分区的组成员(如果有)。

您可以通过从消费者处获取内偏移来获得延迟

Set<TopicPartition> partitionSet = consumer.assignment();
Map<TopicPartition, Long> endOffsets =consumer.endOffsets(consumer.assignment());

consumer.position(tp)——将获得当前偏移量,从endoffset中减去它,得到滞后量

为什么需要的输出选项卡不同?Kafka offset命令也运行Java(实际上是Scala),并且它的源代码在Github上,如果您只想复制ITDO consumer.EndOffset,它在请求结束偏移量时会与来自不同组的其他消费者竞争?请求最新偏移量是否与在幕后消费消息相同?它是否会导致重新平衡?还可以看看您是否有兴趣回答这个问题。感谢您的回复。谢谢!
endOffsets()
不需要消费群体,因此不需要重新平衡。而且它也不涉及消费任何消息。这就是为什么它比您发布的逻辑更有效。谢谢Mickeel。关于
列表消费群体偏移量如何
?我有一个非常繁忙的性能敏感话题,有10个分区,每个分区有10个以上的消费者消费来自ap的消息当我从应用程序B发出
listConsumerGroupOffsets
请求时,应用程序A将以任何方式影响它们的处理?在收集偏移量指标时,我还应该注意哪些其他事项?谢谢!
listConsumerGroupOffsets()
只需发送一个
OffsetFetch
请求。它不会影响现有组,而且其性能成本微不足道。
for(TopicPartition tp : partitionSet) { LOG.info("Topic :: {} ,EndOffset :: {}, currentOffset {}",tp.topic(),beginningOffsets.get(tp),endOffsets.get(tp), consumer.position(tp)); }