跳到主要内容

Apache Kafka 教程

欢迎学习 Apache Kafka!本教程将带你从零基础开始,全面掌握 Kafka 的核心知识和技能。

什么是 Apache Kafka?​

Apache Kafka 是一个分布式事件流平台(Distributed Event Streaming Platform),由 LinkedIn 于 2011 年开源,现已成为 Apache 软件基金会的顶级项目。它专门设计用于处理实时数据流,具有高吞吐量、低延迟、高可扩展性和高容错性的特点。

核心定义​

从技术角度来看,Kafka 实现了事件流(Event Streaming)的三大核心能力:

  1. 发布与订阅(Publish and Subscribe):持续捕获和处理实时事件
  2. 存储(Storage):以持久化、容错的方式存储事件
  3. 处理(Processing):实时或回溯性地处理事件

Kafka 与传统消息队列的区别​

特性Kafka传统消息队列(如 RabbitMQ)
架构分布式日志系统消息代理
消息持久化高性能顺序写入磁盘内存或磁盘
消息顺序分区内有序全局有序(性能代价高)
消费模式消费者组自主控制偏移量推模式(Push)
消息保留基于时间/大小,持久化存储消费后删除
扩展性水平扩展(分区、副本)垂直扩展为主
性能百万级消息/秒万级消息/秒

Kafka 的应用场景​

1. 消息队列(Message Queue)​

Kafka 最基本的用途是作为高性能消息队列,替代传统的消息中间件:

  • 异步处理:将耗时操作解耦,提高系统响应速度
  • 流量削峰:在流量高峰时缓存请求,平滑处理
  • 系统解耦:微服务之间通过 Kafka 进行异步通信

2. 日志聚合(Log Aggregation)​

Kafka 可以收集来自不同服务的日志数据:

  • 集中式日志处理和分析
  • 实时监控告警
  • 日志持久化存储

3. 实时流处理(Real-time Stream Processing)​

配合 Kafka Streams 或其他流处理框架:

  • 实时数据清洗和转换
  • 实时指标计算
  • 事件驱动架构(EDA)

4. 事件溯源(Event Sourcing)​

  • 记录系统所有状态变更
  • 支持回溯和重放
  • 构建完整的审计日志

5. 变更数据捕获(CDC)​

  • 监听数据库变更
  • 实时同步数据到其他系统
  • 构建数据管道

Kafka 核心概念​

主题(Topic)​

主题是 Kafka 中存储事件的核心抽象,类似于文件系统中的文件夹:

主题特性:

  • 多生产者:一个主题可以有多个生产者
  • 多消费者:一个主题可以被多个消费者组独立消费
  • 持久化:消息持久化到磁盘,支持配置保留时间
  • 分区:主题可以分为多个分区,实现并行处理

生产者(Producer)​

生产者负责将事件发布到 Kafka 主题:

// Java 生产者示例
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");

Producer<String, String> producer = new KafkaProducer<>(props);

// 发送消息
ProducerRecord<String, String> record = new ProducerRecord<>("user-events", "user123", "{\"action\":\"login\"}");
producer.send(record);
producer.close();

消费者(Consumer)​

消费者从主题订阅和消费消息:

// Java 消费者示例
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-consumer-group");
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("user-events"));

while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
System.out.println("Received: " + record.value());
}
}

消费者组(Consumer Group)​

消费者组是一组共同消费主题的消费者:

关键特性:

  • 每个分区只能被组内一个消费者消费
  • 不同消费者组独立消费,互不影响
  • 支持消息重放(通过重置偏移量)

分区(Partition)​

分区是 Kafka 实现并行和处理的核心:

  • 顺序保证:同一分区内的消息有序
  • 负载均衡:消息分布在不同分区
  • 并行消费:消费者并行消费不同分区

消息键(Key)可以决定消息发送到哪个分区:

// 使用键确保同一用户的消息在同一个分区
ProducerRecord<String, String> record = new ProducerRecord<>(
"user-events", // 主题
"user123", // 键 - 决定分区
"{\"action\":\"login\"}"
);

偏移量(Offset)​

偏移量是消息在分区内的唯一标识:

说明:

  • 蓝色:已消费的消息
  • 橙色:消费者当前偏移量位置(offset=3)
  • 绿色:待消费的消息
  • 下一次消费将从 offset=3 开始

消费者可以控制消费位置:

  • 从头开始:earliest
  • 从最新开始:latest
  • 指定位置:指定具体的 offset

Broker 和集群​

Kafka Broker 是 Kafka 集群中的服务节点:

说明:

  • Topic: orders(3 个分区,副本因子为 3)
  • 每个 Broker 存储多个分区的数据
  • 通过选举产生分区 Leader,负责处理读写请求

每个 Broker 存储多个分区的数据,通过选举产生分区 Leader,负责处理读写请求。

复制(Replication)​

Kafka 通过副本机制保证高可用性:

  • Leader 副本:处理所有读写请求
  • Follower 副本:被动复制 Leader 数据
  • ISR(In-Sync Replicas):与 Leader 保持同步的副本集合
  • Ack 配置:
    • acks=0:不等待确认(高吞吐,低可靠)
    • acks=1:Leader 确认即返回(默认)
    • acks=all:所有 ISR 确认(高可靠)

Kafka 版本演进​

主要版本特性​

版本发布年份主要特性
0.82014复制机制引入
0.92015安全机制、新的消费者 API
0.102016Kafka Streams 引入
0.112017精确一次语义、事务支持
1.02017Kafka Streams 改进
2.02018改进的监控、安全增强
2.42019改进的复制协议
3.02021KRaft 模式(实验性)
3.42023KRaft 模式正式可用
3.72024JBOD 支持 KRaft、新一代消费者协议、分层存储指标

Kafka 3.x 新特性(推荐使用)​

Kafka 3.x 是当前的主流版本,带来了众多重要的架构改进和功能增强:

KRaft 模式(重要)​

KRaft 模式是 Kafka 3.x 最重要的架构变革,彻底移除了对 Zookeeper 的依赖:

  • 架构简化:不再需要独立的 Zookeeper 集群,部署和运维更加简单
  • 元数据管理:集群元数据存储在 Kafka 内部主题 __cluster_metadata 中
  • 扩展性提升:不再受 Zookeeper 的扩展性限制
  • JBOD 支持:Kafka 3.7 开始支持 KRaft 模式下的 JBOD(早期访问版本)

消费者协议改进​

  • 增量重平衡:减少消费者重平衡的影响范围,避免全局同步屏障
  • 粘性分区器:提高生产者吞吐量,减少请求次数
  • 协作粘性分配器:支持增量重平衡的分区分配策略

可观测性增强​

Kafka 3.7 引入了多项可观测性改进:

  • 客户端指标:Broker 端支持收集客户端指标,通过标准化遥测接口提供更好的可见性
  • KRaft 性能指标:新增 11 个 KRaft 性能指标,包括 ActiveControllersCount、CurrentMetadataVersion 等
  • 分层存储指标:提供更详细的分层存储监控数据

其他重要改进​

  • 指数退避重试:客户端重试从静态退避改为指数退避,减少 Broker 过载时的压力
  • Leader 发现优化:优化客户端发现新 Leader 的时间,降低分区 Leader 变更时的端到端延迟
  • 官方 Docker 镜像:提供官方 Apache Kafka Docker 镜像,简化部署流程
  • 动态证书重载:支持重载具有不同 DN/SAN 的证书

教程目录​

基础入门​

核心组件​

进阶内容​

知识速查​

学习建议​

  1. 动手实践:本地搭建 Kafka 集群,动手操作
  2. 理解原理:深入理解分区、复制、偏移量等核心概念
  3. 关注性能:学习生产者、消费者调优
  4. 结合场景:结合实际业务场景学习
  5. 阅读官方文档:官方文档是最权威的参考

参考资料​

准备好开始学习了吗?点击下一章开始你的 Kafka 学习之旅!