Docker Kafka 消费者列表

Docker 是一个开源的应用容器引擎,可以轻松地创建、部署和运行应用程序。Kafka 是一个分布式的事件流平台,用于处理高容量的实时数据流。在本文中,我们将介绍如何使用 Docker 部署 Kafka,并展示如何使用 Kafka 消费者列表来监控消息消费情况。

Docker 安装 Kafka

首先,我们需要安装 Docker 并启动它。然后,在命令行中运行以下命令来下载和运行 Kafka 镜像:

docker run -d --name kafka -p 9092:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 -e KAFKA_AUTO_CREATE_TOPICS_ENABLE=false -e KAFKA_LOG_RETENTION_HOURS=1 confluentinc/cp-kafka:latest

这将下载 Kafka 镜像并在本地运行一个 Kafka 容器。我们还需要将 Kafka 容器的端口映射到本地端口,以便我们可以通过本地主机访问 Kafka 服务。

创建 Kafka 主题和生产者

在 Kafka 中,消息被组织成一个或多个主题。我们首先需要创建一个主题,然后创建一个生产者将消息发送到该主题。

import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.NewTopic;

import java.util.Collections;
import java.util.Properties;

public class KafkaSetup {

    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");

        AdminClient adminClient = AdminClient.create(props);

        NewTopic newTopic = new NewTopic("my-topic", 1, (short) 1);

        adminClient.createTopics(Collections.singleton(newTopic));
        adminClient.close();
    }
}

上述代码演示了如何使用 Kafka 客户端 API 创建一个名为 "my-topic" 的主题。

然后,我们可以编写一个简单的生产者来发送消息到 "my-topic" 主题:

import org.apache.kafka.clients.producer.*;

import java.util.Properties;

public class KafkaProducerExample {

    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        Producer<String, String> producer = new KafkaProducer<>(props);

        ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "Hello, Kafka!");

        producer.send(record, new Callback() {
            public void onCompletion(RecordMetadata metadata, Exception exception) {
                if (exception != null) {
                    System.err.println("Error producing message: " + exception.getMessage());
                } else {
                    System.out.println("Message sent successfully!");
                }
            }
        });

        producer.close();
    }
}

以上代码创建了一个 Kafka 生产者,并将一条消息发送到 "my-topic" 主题。我们可以在 Kafka 中创建多个主题,并将消息发送到不同的主题中。

Kafka 消费者列表

Kafka 提供了一种称为 "消费者组" 的机制,可以将多个消费者组织在一起来处理主题中的消息。消费者组中的每个消费者都会消费一部分主题中的消息。我们可以使用 Kafka 消费者列表来查看每个消费者组中的消费者和它们消费的主题。

以下是一个使用 Kafka Java 客户端 API 获取消费者列表的示例代码:

import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.ListConsumerGroupsResult;
import org.apache.kafka.clients.consumer.ConsumerGroupListing;

import java.util.Properties;
import java.util.concurrent.ExecutionException;

public class KafkaConsumerList {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");

        AdminClient adminClient = AdminClient.create(props);

        ListConsumerGroupsResult consumerGroups = adminClient.listConsumerGroups();
        consumerGroups.all().get().forEach(consumerGroupListing -> {
            System.out.println("Consumer Group: " + consumerGroupListing.groupId());
            System.out.println("Members:");
            try {
                adminClient.describeConsumerGroups(Collections.singleton(consumerGroupListing.groupId())).all().get().forEach((groupId, groupDescription) -> {
                    groupDescription.members().forEach(memberDescription -> {
                        System.out.println("  - Member ID: " + memberDescription.consumerId());
                        System.out.println("    Client ID: " + memberDescription.clientId());