消费多个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.serversgroup.id来创建一个Kafka消费者实例,并订阅了两个主题topic1topic2

步骤二:启动消费者实例

编译并运行上面的代码,即可启动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