Apache Kafka is an open-source distributed streaming system used for stream processing, real-time data pipelines, and data integration at scale.
Kafka 概述
Apache Kafka 是一个分布式流处理平台,最初由 LinkedIn 开发,现由 Apache 软件基金会维护。Kafka 的核心特性包括:
- 高吞吐量: 每秒处理数百万条消息
- 持久化存储: 消息持久化到磁盘,支持消息回溯
- 分布式架构: 支持集群部署,可水平扩展
- 容错性: 数据副本机制保证高可用
- 实时处理: 支持实时流处理
核心概念
- Producer(生产者): 向 Kafka 发送消息的客户端
- Consumer(消费者): 从 Kafka 读取消息的客户端
- Broker(代理): Kafka 集群中的服务器节点
- Topic(主题): 消息的分类,类似数据库的表
- Partition(分区): Topic 的物理分片,实现并行处理
- Offset(偏移量): 消息在分区中的唯一标识
- Consumer Group(消费者组): 多个消费者协作消费同一 Topic
- Replication(副本): 分区的数据备份,保证高可用
安装 Kafka
使用 Docker 安装(推荐)
1 | # docker-compose.yml |
手动安装
1 | # 下载 Kafka |
Kafka 架构
架构图
1 | ┌─────────────────────────────────────────────────────────┐ |
分区和副本
- Partition: 每个 Topic 分为多个 Partition,实现并行处理
- Leader: 每个 Partition 有一个 Leader,负责读写
- Follower: 其他副本作为 Follower,同步 Leader 数据
- ISR (In-Sync Replicas): 与 Leader 保持同步的副本集合
基本操作
Topic 管理
1 | # 创建 Topic |
生产消息
1 | # 控制台生产者 |
消费消息
1 | # 从最新位置开始消费 |
Consumer Group 管理
1 | # 查看消费者组列表 |
程序化使用
Java Producer 示例
1 | import org.apache.kafka.clients.producer.*; |
Java Consumer 示例
1 | import org.apache.kafka.clients.consumer.*; |
Python Producer 示例
1 | from kafka import KafkaProducer |
Python Consumer 示例
1 | from kafka import KafkaConsumer |
Kafka 配置
Broker 重要配置
1 | # server.properties |
Producer 重要配置
1 | # 必需配置 |
Consumer 重要配置
1 | # 必需配置 |
Kafka Streams
Kafka Streams 是一个用于构建实时流处理应用的库。
简单示例
1 | import org.apache.kafka.streams.*; |
性能优化
Producer 优化
1 | # 批处理优化 |
Consumer 优化
1 | # 增加拉取大小 |
Broker 优化
1 | # 使用更多的网络线程 |
监控和管理
常用监控指标
1 | # 查看 Topic 分区状态 |
常见 JMX 指标
- kafka.server:type=BrokerTopicMetrics: 消息速率、字节速率
- kafka.network:type=RequestMetrics: 请求延迟
- kafka.controller:type=KafkaController: Controller 状态
- kafka.log:type=LogFlushStats: 日志刷盘统计
常见问题和解决方案
消息丢失
1 | # Producer 配置 |
消息重复
1 | // 使用幂等性 Producer |
消息乱序
1 | # 确保顺序性 |
总结核心知识要点
Kafka 架构核心
- 分布式架构: Broker 集群 + Zookeeper/KRaft 协调
- 分区机制: Topic → Partition → Segment,实现并行和扩展
- 副本机制: Leader-Follower 模型,ISR 保证数据一致性
- 消费者组: 多个 Consumer 协作,每个 Partition 只被组内一个 Consumer 消费
核心概念示意图
1 | Producer → [Topic: orders (3 partitions, RF=2)] |
关键配置对比
| 配置项 | Producer | Consumer | 说明 |
|---|---|---|---|
acks |
all/1/0 | - | 生产者等待确认级别 |
retries |
3 | - | 重试次数 |
batch.size |
16384 | - | 批次大小(字节) |
linger.ms |
0 | - | 等待时间(毫秒) |
auto.offset.reset |
- | earliest/latest | Offset 重置策略 |
enable.auto.commit |
- | true/false | 自动提交 Offset |
max.poll.records |
- | 500 | 单次拉取最大记录数 |
消息可靠性保证
1. 避免消息丢失
1 | # Producer |
2. 避免消息重复
1 | // 幂等性 Producer |
3. 保证消息顺序
1 | # 方式1: 单分区 |
实际应用场景代码
场景1: 日志收集
1 | // Producer: 收集应用日志 |
场景2: 实时数据管道
1 | // Kafka Streams: 实时聚合 |
场景3: 事件溯源
1 | // 保存事件 |
性能调优清单
1 | # 1. Producer 吞吐量优化 |
常用运维命令
1 | # 创建 Topic(3分区,2副本) |
最佳实践
- Topic 设计: 合理设置分区数(CPU 核数的 2-3 倍),副本因子至少为 2
- 消息格式: 使用 Avro/Protobuf 等序列化格式,配合 Schema Registry
- Offset 管理: 关键业务手动提交 Offset,确保消息处理完成后再提交
- 监控告警: 监控 Consumer Lag、Broker 磁盘使用、网络流量
- 容量规划: 预估消息大小和速率,规划磁盘容量和网络带宽
- 安全配置: 启用 SASL/SSL 认证,配置 ACL 权限控制
核心原理
- Zero-Copy: 利用 sendfile 系统调用减少数据拷贝
- 顺序写入: 利用磁盘顺序写入特性,性能接近内存
- 页缓存: 依赖操作系统页缓存,减少 JVM 堆内存压力
- 批量压缩: 批量压缩消息,减少网络传输和磁盘占用
- 消费者平衡: 通过 Group Coordinator 实现消费者动态平衡