我在Apache Kafka
上建立了一个排队系统。应用程序将向特定Kafka topic
生成消息,在消费者端,我必须使用为该主题生成的所有记录。
我使用新的Java Consumer Api编写了消费者。
代码看起来像
Properties props = new Properties();
props.put("bootstrap.servers", kafkaBrokerIp+":9092");
props.put("group.id",groupId);
props.put("enable.auto.commit", "true");
props.put("session.timeout.ms", "30000");
props.put("auto.offset.reset", "earliest");
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("consumertest"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records){
System.out.println("Data recieved : "+record.value());
}
}
在这里,我需要永远运行消费者,以便生产者推送到kafka主题的任何记录都应立即消费和处理。
所以我的困惑是,使用无限循环(如示例代码中)来使用数据是一种正确的方法吗?
答案 0 :(得分:0)
它适用于我,但您可能希望将内部循环放在try / catch块中,以防您抛出任何异常。如果断开连接,还要考虑定期重新连接任务。
答案 1 :(得分:0)
是的,您可以使用无限循环。实际上,这不是一个繁忙的循环。在每次轮询期间,如果数据不可用,则呼叫将等待给定的时间段。
long millisToWait = 100;
consumer.poll(millisToWait);
新用户自动处理网络通信问题。确保在关机时消费者正常关闭。
答案 2 :(得分:0)
是的,它是使用无限循环消耗数据的正确方法。
消费者通常是长期运行的应用程序 持续轮询Kafka以获得更多数据。消费者必须继续对Kafka进行投票,否则将被视为 死了,它们消耗的分区将移交给另一个 该组中的消费者继续消费。
poll()返回记录列表。每条记录均包含主题,并对 记录来自,分区中记录的偏移量以及 键和记录的值。记录的处理是特定于应用程序的。
如果退出循环,请在退出之前始终先关闭使用者。这将关闭网络连接和套接字,并立即触发重新平衡。
答案 3 :(得分:0)
可以无限循环,但在Kafka用户documentation中可以找到一种稍微更优雅的方法,如下所示:
public class KafkaConsumerRunner implements Runnable {
private final AtomicBoolean closed = new AtomicBoolean(false);
private final KafkaConsumer consumer;
public void run() {
try {
consumer.subscribe(Arrays.asList("topic"));
while (!closed.get()) {
ConsumerRecords records = consumer.poll(10000);
// Handle new records
}
} catch (WakeupException e) {
// Ignore exception if closing
if (!closed.get()) throw e;
} finally {
consumer.close();
}
}
// Shutdown hook which can be called from a separate thread
public void shutdown() {
closed.set(true);
consumer.wakeup();
}
}
这使您可以选择使用挂钩进行正常关机。