簡體   English   中英

如何忽略來自 Kafka 主題的未提交消息

[英]How to ignore uncommitted messages from a Kafka topic

我想要一個能夠滿足兩個要求的 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) ,但無法使其正常工作。

對於讀提交的消息,您必須設置

isolation.level=read_committed

在您的消費者配置中。

在 read_committed 模式下,消費者將只讀取那些已成功提交的事務消息。 它將像以前一樣繼續讀取非事務性消息。 在 read_committed 模式下沒有客戶端緩沖。 相反,read_committed 消費者的分區的結束偏移量將是屬於打開事務的分區中第一條消息的偏移量。 此偏移量稱為“最后穩定偏移量”(LSO)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM