消费多个Kafka主题的Java示例
在实际的应用中,我们经常需要从多个Kafka主题中消费数据,在本文中,我们将介绍如何使用Java来消费多个Kafka主题的数据。
Kafka简介
Apache Kafka是一个分布式流式平台,用于构建实时数据管道和流应用程序。它具有高性能、持久性和容错性,并支持大规模的数据流处理。
消费多个Kafka主题
消费多个Kafka主题的过程与消费单个主题类似,只是需要为每个主题创建一个独立的消费者实例。接下来,我们将通过一个简单的示例来演示如何消费多个Kafka主题。
步骤一:创建Kafka消费者
首先,我们需要创建一个Kafka消费者类,用于消费指定的主题。下面是一个简单的Kafka消费者类的示例:
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
public class MultiTopicConsumer {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
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("topic1", "topic2"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
}
}
}
在上面的示例中,我们创建了一个名为MultiTopicConsumer
的类,通过指定bootstrap.servers
和group.id
来创建一个Kafka消费者实例,并订阅了两个主题topic1
和topic2
。
步骤二:启动消费者实例
编译并运行上面的代码,即可启动Kafka消费者实例,开始消费指定的主题数据。
示例应用
为了更直观地演示消费多个Kafka主题的过程,我们将创建一个示例应用,模拟从两个主题中消费数据,并将数据进行处理。
数据处理
在本示例中,我们将简单地统计两个主题中的消息数量,并绘制成一个饼状图。
pie
title 数据统计
"topic1": 50
"topic2": 70
关系图
为了更好地理解两个主题之间的关系,我们可以使用ER图来展示它们之间的关系。
erDiagram
CUSTOMER ||--o{ ORDER : has
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ LINE-ITEM : buys
完整示例代码
下面是一个完整的示例代码,包括消费多个Kafka主题和数据处理的部分:
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
public class MultiTopicConsumer {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
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("topic1", "topic2"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key