1. 引言Apache Kafka 是一个分布式、高吞吐、可持久化的消息队列系统由 LinkedIn 开发并于 2011 年开源现已成为 Apache 顶级项目。它被广泛应用于日志收集、流式处理、事件驱动架构等场景是当今大数据与微服务生态中不可或缺的基础设施。本文将带你从零认识 Kafka理解它的核心概念、架构设计并通过实际代码演示如何快速上手使用 Kafka 进行消息的发送与消费。2. 什么是 KafkaKafka 本质上是一个分布式消息系统它能够以极高的吞吐量处理海量数据流。与传统消息队列如 RabbitMQ、ActiveMQ不同Kafka 的设计目标是高吞吐单机可支撑每秒数十万条消息的读写。持久化消息落盘存储支持回溯消费。分布式天然支持水平扩展具备高可用性。多订阅者一条消息可被多个消费者组独立消费。Kafka 常被比作「分布式提交日志」——所有消息按顺序追加写入消费者可以自由选择从任意位置开始读取。3. 核心概念在深入使用之前需要先掌握 Kafka 的几个核心概念3.1 Topic主题Topic 是消息的分类单位类似于数据库中的表。生产者将消息写入指定的 Topic消费者从 Topic 中读取消息。3.2 Partition分区每个 Topic 可以被划分为多个 PartitionPartition 是 Kafka 并行处理的基本单位。消息在 Partition 内部是有序的但跨 Partition 不保证全局有序。3.3 Producer生产者负责向 Kafka 发送消息的客户端。生产者可以指定消息写入哪个 Partition也可以由 Kafka 根据 Key 自动路由。3.4 Consumer消费者负责从 Kafka 读取消息的客户端。消费者以消费者组Consumer Group的形式组织组内每个消费者负责消费不同 Partition 的消息从而实现负载均衡。3.5 Broker代理节点Kafka 集群由多个 Broker 组成每个 Broker 是一个独立的 Kafka 服务进程负责存储消息和处理客户端请求。3.6 Offset偏移量Offset 是消息在 Partition 内的位置编号消费者通过记录 Offset 来追踪消费进度从而实现断点续传。4. Kafka 架构设计一个典型的 Kafka 集群架构如下消费者组Kafka 集群生产者Producer 1Producer 2Broker 1Broker 2Broker 3Consumer 1Consumer 2Kafka 依赖ZooKeeper或新版中的 KRaft 模式进行集群元数据管理包括 Broker 注册、Topic 配置、分区 Leader 选举等。5. 环境准备在开始编码之前需要先搭建 Kafka 环境。这里以 Docker 方式快速启动单机 Kafka# 启动 Kafka使用 KRaft 模式无需 ZooKeeperdockerrun-d--namekafka\-p9092:9092\-eKAFKA_CFG_NODE_ID1\-eKAFKA_CFG_PROCESS_ROLESbroker,controller\-eKAFKA_CFG_LISTENERSPLAINTEXT://:9092,CONTROLLER://:9093\-eKAFKA_CFG_ADVERTISED_LISTENERSPLAINTEXT://localhost:9092\-eKAFKA_CFG_CONTROLLER_LISTENER_NAMESCONTROLLER\-eKAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAPCONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT\-eKAFKA_CFG_CONTROLLER_QUORUM_VOTERS1localhost:9093\-eKAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR1\-eKAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR1\-eKAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR1\apache/kafka:3.7.0启动后可以通过以下命令验证 Kafka 是否正常运行dockerexeckafka kafka-topics.sh --bootstrap-server localhost:9092--list6. 实战Java 生产者与消费者下面通过 Java 代码演示 Kafka 的基本使用。首先在pom.xml中引入依赖dependencygroupIdorg.apache.kafka/groupIdartifactIdkafka-clients/artifactIdversion3.7.0/version/dependency6.1 生产者代码importorg.apache.kafka.clients.producer.KafkaProducer;importorg.apache.kafka.clients.producer.ProducerConfig;importorg.apache.kafka.clients.producer.ProducerRecord;importorg.apache.kafka.common.serialization.StringSerializer;importjava.util.Properties;publicclassSimpleProducer{publicstaticvoidmain(String[]args){PropertiespropsnewProperties();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,localhost:9092);props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());try(KafkaProducerString,StringproducernewKafkaProducer(props)){for(inti0;i10;i){Stringmessage消息 i;producer.send(newProducerRecord(my-topic,message));System.out.println(已发送: message);}}}}6.2 消费者代码importorg.apache.kafka.clients.consumer.ConsumerConfig;importorg.apache.kafka.clients.consumer.ConsumerRecord;importorg.apache.kafka.clients.consumer.ConsumerRecords;importorg.apache.kafka.clients.consumer.KafkaConsumer;importorg.apache.kafka.common.serialization.StringDeserializer;importjava.time.Duration;importjava.util.List;importjava.util.Properties;publicclassSimpleConsumer{publicstaticvoidmain(String[]args){PropertiespropsnewProperties();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,localhost:9092);props.put(ConsumerConfig.GROUP_ID_CONFIG,my-group);props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName());props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName());props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,earliest);try(KafkaConsumerString,StringconsumernewKafkaConsumer(props)){consumer.subscribe(List.of(my-topic));while(true){ConsumerRecordsString,Stringrecordsconsumer.poll(Duration.ofMillis(1000));for(ConsumerRecordString,Stringrecord:records){System.out.printf(收到消息: key%s, value%s, partition%d, offset%d%n,record.key(),record.value(),record.partition(),record.offset());}}}}}7. 常见应用场景Kafka 在业界有着广泛的应用典型场景包括日志收集统一收集各服务的日志集中存储与分析。流式处理配合 Kafka Streams 或 Flink 进行实时计算。事件驱动架构微服务之间通过事件解耦提升系统弹性。消息削峰在高并发场景下缓冲突发流量保护下游系统。数据同步作为数据管道将数据从业务库同步到数仓或搜索引擎。8. 总结本文介绍了 Kafka 的核心概念、架构设计以及 Java 实战用法。Kafka 凭借其高吞吐、可持久化、分布式等特性已成为现代大数据与微服务架构中的核心组件。掌握 Kafka 的基本使用是迈向分布式系统开发的重要一步。后续你可以进一步学习 Kafka 的分区策略、消费者组再均衡、事务消息、Kafka Streams 流处理等进阶主题逐步构建起完整的 Kafka 知识体系。
阅读完成 · 觉得有帮助?