Kafka3.0 消费者API

独立消费者案例(订阅主题)

1)需求:
创建一个独立消费者,消费 first 主题中数据。

在这里插入图片描述

注意:在消费者 API 代码中必须配置消费者组 id。命令行启动消费者不填写消费者组id 会被自动填写随机的消费者组 id。

2)编写代码

package com.apache.consumer;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.time.Duration;
import java.util.ArrayList;
import java.util.Properties;

public class CustomConsumer {
    public static void main(String[] args) {
        // 配置
        Properties properties = new Properties();

        // 连接kafka服务器
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092,hadoop103:9092");

        //反序列化
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

        //定义消费者组
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, "test");

        // 创建一个消费者
        KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);

        //定义主题
        ArrayList<String> topic = new ArrayList<>();
        topic.add("first");
        kafkaConsumer.subscribe(topic);

        //消费数据
        while (true) {
            // 设置 1s 中消费一批数据
            ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(Duration.ofSeconds(1));

            for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
                System.out.println(consumerRecord);
            }
        }
    }
}

独立消费者案例(订阅分区)

1)需求:创建一个独立消费者,消费 first 主题 0 号分区的数据。

在这里插入图片描述
2)实现步骤

package com.apache.consumer;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.time.Duration;
import java.util.ArrayList;
import java.util.Properties;

public class CustomConsumerPartition {
    public static void main(String[] args) {
        // 配置
        Properties properties = new Properties();

        // 连接 kafka
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092,hadoop103:9092");

        // 反序列化
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

        // 组id
        properties.put(ConsumerConfig.GROUP_ID_CONFIG,"test");

        // 创建一个消费者
        KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);

        // 订阅主题对应的分区
        ArrayList<TopicPartition> topicPartitions = new ArrayList<>();
        topicPartitions.add(new TopicPartition("first",0));
        kafkaConsumer.assign(topicPartitions);

        // 消费数据
        while (true){
            ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(Duration.ofSeconds(1));

            for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
                System.out.println(consumerRecord);
            }
        }
    }
}

消费者组案例

1)需求:测试同一个主题的分区数据,只能由一个消费者组中的一个消费。

在这里插入图片描述
2)案例实操
复制一份基础消费者的代码(复制订阅主题代码),在 IDEA 中同时启动,即可启动同一个消费者组中的两个消费者。

package com.apache.consumer;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.time.Duration;
import java.util.ArrayList;
import java.util.Properties;

public class CustomConsumer1 {
    public static void main(String[] args) {
        // 配置
        Properties properties = new Properties();

        // 连接kafka服务器
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092,hadoop103:9092");

        //反序列化
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

        //定义消费者组
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, "test");

        // 创建一个消费者
        KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);

        //定义主题
        ArrayList<String> topic = new ArrayList<>();
        topic.add("first");
        kafkaConsumer.subscribe(topic);

        //消费数据
        while (true) {
            // 设置 1s 中消费一批数据
            ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(Duration.ofSeconds(1));

            for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
                System.out.println(consumerRecord);
            }
        }
    }
}

在控制台自行查看即可,

Apache Kafka是一个分布式流处理平台,它主要用于实时数据管道和日志收集。Kafka独立消费者API允许应用程序作为独立消费者Kafka主题中消费消息。以下是Kafka独立消费者API的一些键点: 1. **消费者组(Consumer Group)**:每个消费者都是某个消费者组的一部分,这样可以实现消息的分发和负载均衡。在一个组中,多个消费者可以并行消费主题中的数据。 2. **拉取模型(Pull Model)**:消费者主动从Kafka服务器拉取消息,而不是被动地等待推送。这样可以提供更高的灵活性和可扩展性。 3. **分区(Partitions)**:Kafka主题被划分为多个分区,消费者可以选择一个或多个分区进行消费。每个分区内部的消息是有序的。 4. **位移(Offset Management)**:消费者在消费过程中会保存自己的消费进度,即位移(offset),这样在重启时可以从上次停止的地方继续消费。 5. **回调处理(Polling)**:消费者通过`poll()`方法定期检查新的消息,然后在回调函数中处理这些消息。 6. **消费者配置(Consumer Configurations)**:例如`auto.offset.reset`、`enable.auto.commit`等设置,用于调整消费者的消费策略。 7. **错误处理和恢复**:消费者需要处理网络故障、消息丢失等问题,并能自动或手动重试未成功的操作。 相问题: 1. Kafka的生产者和消费者如何协同工作? 2. 如何在Kafka中设置消费者组的配置? 3. 消费者如何处理消息确认和失败重试? 4. Kafka API提供了哪些高级特性来优化消息消费性能? 5. 如何在Kafka中使用Java或Python实现一个消费者应用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值