有没有办法阻止Kafka消费者在特定的偏移量?

时间:2017-08-30 05:39:23

标签: apache-kafka

我可以寻求特定的偏移量。有没有办法阻止消费者在特定的偏移?换句话说,消耗到我给定的偏移量。据我所知,卡夫卡没有提供这样的功能。如果我错了,请纠正我。

EG。分区有偏移1-10。我只想消费3-8。在使用第8条消息后,程序应退出。

4 个答案:

答案 0 :(得分:2)

是的,kafka不提供此功能,但您可以在您的消费者代码中实现此功能。您可以尝试使用commitSync()来控制它。

  

public void commitSync(Map offset)

     

为指定的主题和分区列表提交指定的偏移量。   这会给Kafka带来抵消。使用此API提交的偏移量将在每次重新平衡后以及启动时的第一次提取时使用。因此,如果您需要在Kafka以外的任何其他位置存储偏移量,则不应使用此API。提交的偏移量应该是应用程序将使用的下一条消息,即lastProcessedMessageOffset + 1.

     

这是一个同步提交,并将阻塞,直到提交成功或遇到不可恢复的错误(在这种情况下,它被抛给调用者)。

这样的事情:

 while (goAhead) {
     ConsumerRecords<String, String> records = consumer.poll(100);
     for (ConsumerRecord<String, String> record : records) {
         if (record.offset() > OFFSET_BOUND) {
            consumer.commitSync(Collections.singletonMap(new TopicPartition(record.topic(), record.partition()), new OffsetAndMetadata(record.offset())));
            goAhead = false;
            break;           
         }
         process(record);
     }
 }

你应该设置&#34; enable.auto.commit&#34;在上面的代码中为false。在您的情况下,OFFSET_BOUND可以设置为8.因为您的示例中提交的偏移量仅为9,所以下次消费者将从此位置获取。

答案 1 :(得分:0)

假设分区偏移是连续的(即不是日志压缩),您可以配置您的消费者(使用max.poll.records配置),以便它在每个轮询中读取特定数量的记录。这可以让你停在你想要的偏移处。

答案 2 :(得分:0)

Librdkafka KafkaConsumer的assignment方法返回一个TopicPartition项,其中包含特定主题和分区的当前偏移量。您有两种方法来确保您的偏移位置:

  • commitSync()
  • 这将尝试提交偏移量并等待其完成,否则将失败并保留当前偏移量。
  • 管理您自己的偏移量。例如,一个具有topic-partition-offset-consumerId estructure的简单SQL数据库可以做到这一点。这样,您就可以将偏移量保存到Kafka中,并且始终知道哪个是要读取的第一个元素。

答案 3 :(得分:0)

据我所知,max.poll.records 是客户端功能。 Kafka 获取协议只有字节限制 https://kafka.apache.org/protocol#The_Messages_Fetch 因此,您通常会在后台阅读更多消息