Java:当我从kafka主题开始阅读时,如何从当前偏移读取

时间:2016-07-29 12:45:17

标签: java apache-kafka

我正在使用Java api使用者连接器。每当消费者开始阅读某个主题时,它会从主题的开头读取,并且需要很长时间才能了解最新事件。我们如何确保消费者从当前的偏移中读取?

4 个答案:

答案 0 :(得分:3)

最简单的方法是在您的消费者配置中禁用自动提交(即auto.commit.enable=false),并使用auto.offset.reset=latest(或=largest用于较旧的Kafka版本。)

卡夫卡的流程如下:

  1. 启动消费者
  2. 消费者寻找有效的承诺
    • 如果找到,则从那里恢复处理
    • 如果未找到,则根据“auto.offset.reset”
    • 开始处理
  3. 因此,只要您的消费者群体存在有效的承诺偏移量,“auto.offset.reset”就完全没有效果。因此,您也不应手动提交。

    如果已经提交了偏移量,则需要在重新启动消费者之前手动删除它,如果要从当前偏移量读取而不是处理和旧数据。 (或者使用新的group.id,您知道没有提交的偏移量。)

    作为所有这些的替代方案,您还可以“寻找结束”您的消费者中的每个分区。但这会使您的代码变得更加复杂,并且如果您的消费者群体根本没有提交,则可以避免这些代码。

答案 1 :(得分:1)

对于kafka 0.10(可能更早)你可以这样做:

properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
consumer = new KafkaConsumer<>(properties);
consumer.seekToEnd(Collections.emptySet());

这将关闭将消费者偏移存储在经纪人身上(因为您不使用它)并寻求所有分区的最新位置。

答案 2 :(得分:0)

for kafka 9:

  1. 如果您为消费者设置了组ID,kafka将为您存储已提交(已处理)的偏移量。如果您在kafka中使用新的消费者,则此方法有效 read more
  2. 如果您总是想要读取最新的偏移量,可以指定OffsetResetStrategy.LATEST

答案 3 :(得分:0)

要完成纳塔利娅的回答,我说你可能不关心存储偏移,你只想总是消费最新的消息。

为了使用大多数消费者实现(包括&#34;旧的&#34;消费者在0.8.x和#34;新的&#34;消费者在0.9.x及以上),你需要做两件事:

  1. 将组ID设置为随机值,这样每次消费者启动它时都无法从任何地方恢复偏移,这将触发&#34;偏移重置&#34;请求。
  2. OffsetRequestStrategy(或您使用的客户端中调用的任何内容)设置为latest,以便当您的客户端要求Kafka提供可用的偏移时,它会获取最后(最新)消息的偏移量在日志中。