Apache Kafka获取特定主题的使用者列表

时间:2019-05-01 14:25:53

标签: java apache-kafka kafka-consumer-api

由于可以从标题中邀请客人,有没有一种方法可以获取有关Java中特定主题的使用者列表? 直到现在,我仍能获得像这样的主题列表

    final ListTopicsResult listTopicsResult = adminClient.listTopics();
    KafkaFuture<Set<String>> kafkaFuture = listTopicsResult.names();
    Set<String> map = kafkaFuture.get();

但是我还没有找到一种获取每个主题的消费者列表的方法

3 个答案:

答案 0 :(得分:3)

我最近正在为我的kafka客户端工具解决相同的问题。这并不容易,但是从代码中找到的唯一方法是:

Properties props = ...//here you put your properties
AdminClient kafkaClient = AdminClient.create(props);

//Here you get all the consumer groups
List<String> groupIds = kafkaClient.listConsumerGroups().all().get().
                       stream().map(s -> s.groupId()).collect(Collectors.toList()); 

//Here you get all the descriptions for the groups
Map<String, ConsumerGroupDescription> groups = kafkaClient.
                                               describeConsumerGroups(groupIds).all().get();
for (final String groupId : groupIds) {
    ConsumerGroupDescription descr = groups.get(groupId);
    //find if any description is connected to the topic with topicName
    Optional<TopicPartition> tp = descr.members().stream().
                                  map(s -> s.assignment().topicPartitions()).
                                  flatMap(coll -> coll.stream()).
                                  filter(s -> s.topic().equals(topicName)).findAny();
            if (tp.isPresent()) {
                //you found the consumer, so collect the group id somewhere
            }
} 

此API可从版本2.0中获得。也许有更好的方法,但是我找不到。您也可以在我的bitbucket

上找到代码

答案 1 :(得分:2)

消费者与主题无关。他们与消费者群体紧密联系

要获取主题的所有使用者,必须首先列出所有组,然后在每个组中过滤出主题

哪个会以AdminClient.listConsumerGroups开头,然后是AdminClient.describeConsumerGroups

这将为您提供包含“成员”的描述列表,您可以在其中找到主题

https://kafka.apache.org/20/javadoc/org/apache/kafka/clients/admin/ConsumerGroupDescription.html

注意:像Hortonworks SMM https://docs.hortonworks.com/HDPDocuments/SMM/SMM-1.2.0/monitoring-kafka-clusters/content/smm-monitoring-consumers.html

这样的外部工具使此操作变得更加容易

答案 2 :(得分:0)

我知道这个主题有点老,但是我目前正在使用仪表板,该仪表板需要列出与相关消费者群体相关的主题。 Katya的回答还可以,但是对于没有活跃成员的消费者组,它仍然不会列出TopicPartitions。 我遇到了这个解决方案,希望对您有所帮助:

Properties props = ...//here you put your properties
AdminClient kafkaClient = AdminClient.create(props);

Map<TopicPartition, OffsetAndMetadata> offsets = kafkaClient
    .listConsumerGroupOffsets("consumer_group_name")
    .partitionsToOffsetAndMetadata()
    .get();
可以对偏移量映射中的

TopicPartition进行特定主题的解析。可以对 Katya的答案中的整个groupId列表重复此列表。