跳到主要内容

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 学习之旅!