如何忽略来自Kafka主题的未提交消息

时间:2019-12-22 12:59:12

标签: java apache-kafka kafka-consumer-api

我希望有一个能够满足两个要求的Kakfa消费者:

  1. 在需要时消费所有消息(获取)
  2. 放弃/忽略所有尚未提交的消息(需要帮助)

为简单起见,我只运行一个主题和一个分区。 这是我设置消费者的方式:

private Consumer<Long, String> createConsumer() {
    final Properties props = new Properties();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(ConsumerConfig.GROUP_ID_CONFIG, "KafkaExampleConsumer");
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName());
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

    final Consumer<Long, String> consumer = new KafkaConsumer<>(props);

    consumer.subscribe(Collections.singletonList(topic));
    return consumer;
}

这是我用来完成需求编号1的方法:

public void write() {
    final ConsumerRecords<Long, String> consumerRecords = transactionsConsumer.poll(1000);
    consumerRecords.forEach(record -> System.out.printf("Consumer Record:(%d, %s, %d, %d)\n",
                record.key(), record.value(), record.partition(), record.offset()));

    transactionsConsumer.commitAsync(); 
}

它工作正常,但是至于要求2号,我并没有真正获得最好的方法。我知道我可以实现一个write()类似方法,该方法消耗并且不打印任何内容,但是对于忽略消息而言,这似乎工作太多。另外,我认为,如果我有很多消息要使用,那么这样做可能会很昂贵。我看了诸如seekToEnd(partition)之类的方法,但无法使其正常工作。

1 个答案:

答案 0 :(得分:0)

要阅读已提交的邮件,必须设置

  

isolation.level = read_committed

使用用户的配置。

  

在read_committed模式下,使用者将仅读取已成功提交的那些事务性消息。它将像以前一样继续读取非事务性消息。在read_committed模式下没有客户端缓冲。取而代之的是,针对read_committed使用者的分区的结束偏移量将是该分区中属于未清事务的第一条消息的偏移量。此偏移称为“最后稳定偏移”(LSO)。