我正在使用Java api使用者连接器。每当消费者开始阅读某个主题时,它会从主题的开头读取,并且需要很长时间才能了解最新事件。我们如何确保消费者从当前的偏移中读取?
答案 0 :(得分:3)
最简单的方法是在您的消费者配置中禁用自动提交(即auto.commit.enable=false
),并使用auto.offset.reset=latest
(或=largest
用于较旧的Kafka版本。)
卡夫卡的流程如下:
因此,只要您的消费者群体存在有效的承诺偏移量,“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:
答案 3 :(得分:0)
要完成纳塔利娅的回答,我说你可能不关心存储偏移,你只想总是消费最新的消息。
为了使用大多数消费者实现(包括&#34;旧的&#34;消费者在0.8.x和#34;新的&#34;消费者在0.9.x及以上),你需要做两件事:
OffsetRequestStrategy
(或您使用的客户端中调用的任何内容)设置为latest
,以便当您的客户端要求Kafka提供可用的偏移时,它会获取最后(最新)消息的偏移量在日志中。