4.4 Kafka Consumer API之手动控制一个或多个分区的消费

本文详细解读了如何使用Java实现Kafka消费者,通过代码示例展示了如何配置消费者、订阅主题、处理消息并提交偏移量。重点介绍了控制台输出的解读,包括生产者生成的消息和消费者消费的结果。

1.代码示例

public class ConsumerSample {
    private static final String topicName = "steven";

    public static void main(String[] args) {
        //Consumer配置
        Properties props = new Properties();
        props.setProperty("bootstrap.servers", "127.0.0.1:9092");
        props.setProperty("group.id", "test");
        props.setProperty("enable.auto.commit", "false");
        //enable.auto.commit设置为false后,下面这一项便不会生效
        props.setProperty("auto.commit.interval.ms", "1000");
        props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        //Consumer的主对象
        KafkaConsumer<String, String> consumer = new KafkaConsumer(props);

        //订阅某个topic的某个partition
        TopicPartition p0 = new TopicPartition(topicName, 0);
        TopicPartition p1 = new TopicPartition(topicName, 1);
        consumer.assign(Arrays.asList(p0));

        while (true) {
            //批量拉取消息
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(10000));
            //每个partition单独处理
            for (TopicPartition partition : records.partitions()) {
                List<ConsumerRecord<String, String>> pRecord = records.records(partition);
                for (ConsumerRecord<String, String> record : pRecord) {
                    System.out.printf("partition = %d,offset = %d,key = %s,value = %s%n", record.partition(), record.offset(), record.key(), record.value());
                }
                long lastOffset = pRecord.get(pRecord.size() - 1).offset();
                //单个partition中的offset,并且进行提交
                Map<TopicPartition, OffsetAndMetadata> offset = new HashMap<>();
                offset.put(partition, new OffsetAndMetadata(lastOffset + 1));
                // 提交offset
                consumer.commitSync(offset);
                System.out.println("=============partition - " + partition + " end================");
            }
        }
    }
}

2.代码运行结果
(1).控制台输出
运行自定义分区负载均衡发送示例代码向kafka发送10条数据,然后再执行ConsumerSample代码进行消费,便可在控制台看见代码中指定的输出信息。

partition = 0,offset = 0,key = key-0,value = value-0
partition = 0,offset = 1,key = key-2,value = value-2
partition = 0,offset = 2,key = key-4,value = value-4
partition = 0,offset = 3,key = key-6,value = value-6
partition = 0,offset = 4,key = key-8,value = value-8
=============partition - steven-0 end================

(2).终端输出
打开一个cmd终端,在E:\Kafka\kafka_2.12-1.1.0\bin\windows目录下执行kafka-console-consumer.bat --zookeeper localhost:2181 --topic steven,可以看到生产的消息。
在这里插入图片描述

一、基础知识与概念1.1 简要介绍Apache Kafka是什么,它的主要用途是什么?1.2 解释一下Kafka中的Producer、Broker、Consumer以及Topic的概念?1.3 Kafka的消息是如何保证顺序性的?1.4 Kafka中的消息是如何存储的?1.5 解释Kafka的高可用性和分区(Partitions)机制?二、架构与设计2.Kafka集群是如何工作的?如何设计一个高可用的Kafka集群?2.Kafka中的副本(Replication)是如何实现的?它如何保证数据不丢失?2.3  解释一下Kafka的ISR(In-Sync Replica)列表及其重要性?2.4 Kafka支持的几种消息传递语义有哪些?2.5  如何在Kafka中实现消息的持久化和缓存策略?三、消费者与生产者3.Kafka消费者如何消费消息?特别是谈论消费者组的概念及其作用。3.2 如何在Kafka生产者中配置消息发送的可靠性保障?3.3 Kafka消费者如何处理消息的偏移量(Offsets)管理?手动提交与自动提交的区别?3.4  如何实现Kafka的 Exactly-Once 消息传递语义?四、性能与优化4.1  影响Kafka性能的因素有哪些?如何进行性能调优?4.2  解释Kafka的批处理机制及其对性能的影响?4.Kafka如何处理大量消息积压的情况?4.4  谈谈Kafka的延时问题以及可能的解决方案?五、故障排查与安全性5.1  如果Kafka Broker宕机了,会有什么影响?如何恢复?5.2  如何监控和诊断Kafka集群的健康状况?5.Kafka提供了哪些安全特性来保护数据?如何实施认证和授权?5.4  在多租户环境下,如何确保Kafka的安全隔离?
最新发布
04-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值