五、Kafka消费者

目录

    • [5.1 Kafka的消费方式](#5.1 Kafka的消费方式)
    • [5.2 Kafka 消费者工作流程](#5.2 Kafka 消费者工作流程)
    • [5.3 消费者API](#5.3 消费者API)
      • [1 独立消费者案例(订阅主题)](#1 独立消费者案例(订阅主题))
      • [2 独立消费者案例(订阅分区)](#2 独立消费者案例(订阅分区))
      • [3 消费者组案例](#3 消费者组案例)
    • [5.4 生产经验------分区的分配以及再平衡](#5.4 生产经验——分区的分配以及再平衡)

5.1 Kafka的消费方式

pull(拉)模 式:consumer采用从broker中主动拉取数据。Kafka采用这种方式。

缺点: pull模式不足之处是,如 果Kafka没有数据,消费者可能会陷入循环中,一直返回空数据

push(推)模式:Kafka没有采用这种方式,因为由broker决定消息发送速率,很难适应所有消费者的消费速率

5.2 Kafka 消费者工作流程

1、总体流程

【注意】

  • 消费者只能从主分区上拉取数据,从节点起到同步和冗余数据的作用
  • 每个分区的数据只能由消费者组中一个消费者消费
  • 一个消费者可以消费多个分区数据
  • 每个消费者的offset由消费者提交到系统主题保存

2、消费者组原理

Consumer Group(CG):消费者组,由多个consumer组成。形成一个消费者组的条件,是所有消费者的groupid相同。

  • 消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费。
  • 消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者

3、消费者组初始化流程

4、消费者组详细消费流程

5.3 消费者API

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

java 复制代码
public class CustomConsumer {

    public static void main(String[] args) {

        // 0 配置
        Properties properties = new Properties();

        // 连接 bootstrap.servers
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.239.11: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,"test5");

        // 设置分区分配策略

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

        // 2 订阅主题 first
        ArrayList<String> topics = new ArrayList<>();
        topics.add("first");
        kafkaConsumer.subscribe(topics);

        // 3 消费数据
        while (true){

            ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(Duration.ofSeconds(1));

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

            kafkaConsumer.commitAsync();
        }
    }
}

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

java 复制代码
public class CustomConsumerPartition {

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

        // 连接
        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");

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

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

        // 3 消费数据
        while (true){

            ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(Duration.ofSeconds(1));

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

3 消费者组案例

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

5.4 生产经验------分区的分配以及再平衡

相关推荐
Paraverse_徐志斌12 小时前
基于 Zookeeper 部署 Kafka 集群
ubuntu·zookeeper·kafka·消息队列
MZWeiei15 小时前
Kafka 生产者工作流程详解
大数据·分布式·kafka
shark-chili17 小时前
Kafka快速安装与使用
kafka
渣渣盟20 小时前
Flink流处理:多源传感器数据实时处理,基于Scala使用Flink从不同数据源(集合、文件、Kafka、自定义 Source)读取传感器数据
flink·kafka·scala
Uranus^1 天前
深入解析Spring Boot与Kafka集成:构建高性能消息驱动应用
spring boot·kafka·消息队列·分布式系统
{⌐■_■}1 天前
【kafka】kafka概念,使用技巧go示例
golang·kafka·linq
predisw2 天前
kafka connect 大概了解
分布式·kafka
张伯毅2 天前
Flink SQL 将kafka topic的数据写到另外一个topic里面
sql·flink·kafka
Will_11302 天前
kafka调优
分布式·kafka
0吉光片羽02 天前
【SpringBoot】集成kafka之生产者、消费者、幂等性处理和消息积压
spring boot·kafka·linq