Kafka 概念与概述
一、Kafka 概念
Apache Kafka 是一个分布式流处理平台,核心特点是高吞吐量、可持久化、可扩展。它既可以作为 消息队列,也可以作为 流数据平台。
Kafka 的核心目标:
- 消息传递:服务间异步通信。
- 日志存储:保留历史消息,支持回溯。
- 流处理:处理实时数据流(结合 Kafka Streams / Flink / Spark Streaming)。
二、Kafka 核心概念
名称 | 说明 |
---|---|
Producer | 消息生产者,发送消息到 Kafka |
Consumer | 消费者,从 Kafka 订阅和消费消息 |
Topic | 消息主题,逻辑上的分类 |
Partition | Topic 的分区,保证消息顺序性和并行性 |
Broker | Kafka 服务节点,多个 Broker 组成集群 |
Zookeeper / KRaft | Kafka 元数据管理(Zookeeper 老模式 / KRaft 新模式) |
Consumer Group | 消费者组,实现消息负载均衡与容错 |
三、Kafka 特性
-
高吞吐:百万级消息/秒,支持水平扩展。
-
消息持久化:消息写入磁盘,可设置保留时间。
-
顺序保证:Partition 内消息顺序有保障。
-
容错能力:Replica 机制,Leader-Follower 模式。
-
多种消费模式:
- 点对点:单消费者消费消息
- 发布/订阅:多个消费者订阅同一 Topic
四、Kafka 在微服务中的应用场景
-
异步解耦:服务间无需直接调用,降低耦合。
- 例:订单服务生成订单 → 发送消息到 Kafka → 库存服务消费消息扣减库存。
-
流处理:
- 实时统计、数据清洗、实时推荐。
-
事件溯源:
- 事件驱动架构(EDA),每个事件都可回溯。
-
日志系统:
- 将系统日志或业务日志发送到 Kafka,再通过 ELK 分析。
五、Kafka 集群架构(简化示意)
+-----------+ +-----------+ +-----------+
| Producer | ----> | Broker 0 | ----> | Consumer |
+-----------+ +-----------+ +-----------+/ \+-----------+ +-----------+| Broker 1 | | Broker 2 |+-----------+ +-----------+Replication Factor = 3
说明:
- Topic 分为多个 Partition。
- 每个 Partition 有一个 Leader 和 N 个 Follower。
- Producer 发送消息到 Partition Leader。
- Consumer 从 Partition Leader 或 Follower 拉取消息。
- Replica 保证高可用。
六、Java 使用 Kafka 示例
1. Maven 依赖
<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.5.1</version>
</dependency>
2. 生产者示例
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");KafkaProducer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("test-topic", "key1", "Hello Kafka");
producer.send(record);
producer.close();
3. 消费者示例
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "group1");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("test-topic"));while(true){ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {System.out.printf("offset=%d, key=%s, value=%s%n", record.offset(), record.key(), record.value());}
}
七、Kafka 与云原生结合
-
容器化:Kafka 可在 Docker / Kubernetes 中部署。
-
K8s Operator:使用 Strimzi/Kafka Operator 简化 Kafka 集群管理。
-
微服务解耦:
- Spring Boot + Spring Cloud Stream 集成 Kafka。
- 使用 Kafka 作为微服务事件总线。
-
弹性扩容:
- Partition 数量可调整,Consumer Group 动态伸缩。
-
可观测性:
- Prometheus + Grafana 监控 Broker、Topic、Consumer lag。
- Kafka Exporter 提供指标。
八、微服务架构中 Kafka 的优势
- 消息异步传递,减少服务阻塞。
- 高可用、水平扩展,适合大规模系统。
- 支持事件驱动架构,系统更灵活。
- 可持久化消息,实现日志和事件溯源。
- 与云原生环境高度兼容,支持容器化和自动伸缩。