繁体   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