我是否可以在不检索所有消息的情况下检索Kafka分区的最新可用偏移量?

时间:2016-07-31 14:08:42

标签: apache-kafka kafka-consumer-api

查看最新的(v0.10)Kafka消费者documentation

“消费者的位置给出了将要发出的下一条记录的偏移量。它将比消费者在该分区中看到的最高偏移量大一个。它会自动前进消费者接收数据电话民意调查(长)并接收消息的时间。“

有没有办法查询服务器端分区可用的最大偏移量,没有检索所有消息?

我试图实现的逻辑如下:

  1. 每秒查询主题
  2. 中待处理邮件的数量(A)
  3. 如果A>阈值,唤醒将继续检索所有消息并处理它们的处理器
  4. 否则什么都不做(睡1)
  5. 我的动机是我需要进行一些批处理,但我希望处理器只在有足够的数据时醒来(而且我不想两次检索所有数据)。

3 个答案:

答案 0 :(得分:7)

您可以使用Consumer.seekToEnd()方法,运行Consumer.poll(0)使其生效但立即返回,然后Consumer.position()查找所有已订阅(或已分配)主题分区的位置。这些将是所有分区的当前最终偏移量。这也将开始从代理中获取这些偏移量的一些数据,但如果您随后寻求回到不同的位置,任何返回的数据都将被忽略。

目前serejja提到的另一种选择是使用旧的简单消费者,尽管这个过程要复杂得多,因为你需要手动找到每个分区的领导者。

答案 1 :(得分:1)

可悲的是,我不知道0.10消费者如何做到这一点。

但是,如果您有任何较低级别的Kafka客户端,这是可行的(对不起,但我不确定JVM是否存在,但是其他语言有很多)。

因此,如果你有时间和灵感来实现这一点,那么就行了 - 每个FetchResponse(这是每个&#34的响应;给我消息"请求)包含一个名为HighwaterMarkOffset的字段,它基本上是分区末尾的偏移量(https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-FetchResponse)。这里的诀窍是发送一个FetchRequest,它会立即返回(例如,等待阻止等待)除了HighwaterMarkOffset之外什么都没有。

为此,您的FetchRequest应该:

  1. MaxWaitTime设置为0,这意味着"如果无法获取至少MinBytes字节,则立即返回"。
  2. MinBytes设置为0,这意味着"如果你给我一个空的回复,我就可以了。#/ li>。
  3. FetchOffset在这种情况下并不重要,如果我没有错,它甚至可能是无效的偏移,但最好是有效的偏移。
  4. MaxBytes设置为0,这意味着"给我不超过0个字节的数据",例如什么都没有。
  5. 这样,此请求将立即返回,没有数据,但仍将highwatermark偏移设置为适当的值。获得高水位线偏移后,您可以将其与当前偏移量进行比较,并计算出您的背后有多少。

    希望这有帮助。

答案 2 :(得分:0)

您可以使用以下API中的此方法public OffsetAndMetadata committed(TopicPartition partition)来获取上次提交的偏移量

https://kafka.apache.org/0100/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html