如何在Java中获取主题所属的代理

时间:2019-05-21 16:20:25

标签: java apache-kafka apache-zookeeper

我有一群kafka经纪人。我正在尝试获取主题级别的指标,对于位于代码指向的特定代理上的主题,我已经成功完成了该指标。 Zookeeper返回所有经纪人上所有主题的列表。当我尝试获取每个主题的指标时,这会导致失败。

我正在使用此功能从Zookeeper获取主题列表:

ZooKeeper zk = new ZooKeeper("kafka.ip:port", 1000, null);
return zk.getChildren("/brokers/topics", false);

要获取主题指标,我正在使用JMX。 JMX连接器仅指向单个代理。当我用来获取指标的代码碰到该代理上不存在的主题时,它会失败,因为该主题在代理眼中并不存在。

这导致了我的问题:是否有办法让某个话题持续存在的经纪人?有没有更好的方法可以做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:1)

要获取主题分区所在的代理,可以使用AdminClient界面。像

AdminClient kafkaClient = new AdminClient(properties)) 
DescribeTopicsResult result = kafkaClient.describeTopics(Collections.singleton(topicName));
Map<String, TopicDescription> descriptions = result.all().get();
descriptions.values().stream().forEach(t->{
    t.partitions().stream().forEach(p->{
        Node leader = p.leader(); //here is a leader for partition
        List<Node> replicas = p.replicas(); //here are the replicas
     });
 });

尽管我不确定这对您来说是个好主意。

答案 1 :(得分:0)

通常,Kafka主题分为多个分区。这些分区分布在多个代理中。考虑到这一点,您还不清楚要获得什么。