【问题标题】:Unable to get Kafka lag from all partitions无法从所有分区中获取 Kafka 滞后
【发布时间】:2020-05-16 04:43:43
【问题描述】:

有没有办法为分配到同一消费者组的所有消费者找到整个 kafka 滞后?

我只能得到分配分区的延迟。例如假设只有一个分区分配给消费者,下面的代码只会为该分区带来延迟。不适用于其他分区。

Set<TopicPartition> partitionSet = consumer.assignment();
        Map<TopicPartition, Long> endOffsets = consumer.endOffsets(partitionSet);
for(TopicPartition tp : partitionSet) {
            LOG.info("Topic:{}, EndOffset:{}, currentOffset:{}, LAG:{}",
                    tp.topic(), endOffsets.get(tp), consumer.position(tp), endOffsets.get(tp)-consumer.position(tp));
        }

基本上,希望找到所有分区的滞后总和,以了解一个主题的所有消费者(同一组)滞后多少。

另外,有没有类似于 kafka-consumer-groups 的 api 可用,并通过 bootstrap-server 和 group 作为参数来查找滞后?

./kafka-consumer-groups.sh --bootstrap-server --group --describe

【问题讨论】:

  • kafka-consumer-groups 只是 Scala 类的包装器。您可以从代码中调用它
  • 或者,您可以设置外部监控,如 Burrow 或 Prometheus 以跟踪所有组滞后

标签: java apache-kafka


【解决方案1】:

以编程方式实现此目的的正确方法是使用 AdminClient API:

  1. 使用listConsumerGroupOffsets() 获取组的已提交偏移量。

  2. 获取日志结束偏移量。目前,您需要启动消费者并为步骤 1 中检索到的所有分区调用 endOffsets()

    在 Kafka 2.5(预计 2020 年 2 月结束)中,有一个新的 AdminClient API 来检索日志结束偏移量listOffsets(),这将允许单独使用 AdminClient 来检索滞后。

  3. 对于每个分区,从日志结束偏移量(步骤 2)中减去提交的偏移量(步骤 1)。

这基本上是kafka-consumer-groups.sh 在幕后所做的。因此,如果需要,请查看implementation of this tool

【讨论】:

  • 是的! listOffsets() 是我想要的。现在完全不需要 Consumer 就可以让消费者满意了。
猜你喜欢
  • 2018-04-28
  • 2018-09-24
  • 2018-06-12
  • 2022-01-20
  • 2019-05-20
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
相关资源
最近更新 更多