簡體   English   中英

Kafka:按需使用所有消息

[英]Kafka: consume all messages on demand

目標:閱讀主題中的所有消息,然后終止該過程。

我能夠通過以下方式連續閱讀消息:

props.put("bootstrap.servers", kafkaBootstrapSrv);
props.put("group.id", group_id);
props.put("max.poll.records", 1); // Only get one record at a time. I understand that to read all messages this will need to be increased
props.put("enable.auto.commit", "false");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("MY_TOPIC"));

while (true) {
    ConsumerRecords<String, String> records = consumer.poll(500);

    for (ConsumerRecord<String, String> record : records) {
        process_record(record);
    }

    consumer.commitSync();
}

但是在這種情況下,該過程永遠不會終止。 當我擺脫

while (true)

循環並運行該程序,它不會從該主題中獲取一條記錄(我希望有一條記錄)。 這是為什么?

Kafka主題基本上實現了無數事件。

那么,何時從某個話題開始消費就停止? 你怎么知道你到達終點了? 簡短的答案是你不知道! 理論上,制作人可以始終向該主題發送新信息。

在實踐中,假設沒有附加新記錄或只有很少新記錄,您可以做一些事情來結束。

使用endOffsets()可以找到分區的當前最近偏移量。 使用方達到分配給它的所有分區的偏移量后,就可以停止輪詢(或刷新它,並查看是否已發送新消息)。

您可以使用position()方法檢索每個分區中的當前位置。 使用時,每個記錄還通過offset()公開其自己的偏移offset() 因此,您可以使用這些來跟蹤到終點偏移的進度。

關於第二個關於poll()問題,它在第一次調用時不返回任何內容。 這是可以預期的,因為基本上poll()使客戶端能夠工作,並且在第一次調用時,它將啟動與群集的連接並啟動組協議(這需要幾秒鍾),因此在poll()之前不太可能已經收到消息poll()返回。

暫無
暫無

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

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