【发布时间】:2019-08-11 12:23:25
【问题描述】:
我需要读取从开始偏移到结束偏移的记录集。为此,我使用专用的 Kafka 消费者。我至少可以接受一次语义(如果给定的应用程序实例出现故障,并且新的应用程序实例从该起始偏移量重新读取记录)。
那么,我可以使用这样的代码吗?
private static KafkaConsumer<Long, String> createConsumer() {
final Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
return new KafkaConsumer<>(props);
}
public void process() {
KafkaConsumer consumer = createConsumer();
TopicPartition topicPartition = new TopicPartition("topic", 2);
consumer.assign(List.of(topicPartition));
long startOffset = 42;
long endOffset = 100;
consumer.seek(topicPartition, startOffset);
boolean isRunning = true;
while (isRunning) {
final ConsumerRecords<Long, String> consumerRecords = consumer.poll(1000);
for (ConsumerRecord<Long, String> record : consumerRecords) {
if (record.offset() >= endOffset) {
isRunning = false;
break;
}
}
}
consumer.close();
}
所以:
- 我没有
commit() - 我禁用
auto-commit - 我没有
group-id
它是正确的代码吗?还是有一些隐藏的问题?
【问题讨论】:
-
你可以,尽管看起来你有错误的技术。将这些事件加载到适当的数据库中并按需重新加载会有什么问题?这个答案也可以是interesting。有几种方法可以实现您想做的事情
-
您还应该更改您的代码以使用
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); -
@senseiwu 比
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");更快吗? -
如果不添加,则不会从最早的offset开始消费给新的consumer。
标签: java apache-kafka kafka-consumer-api