当前位置: 首页 > news >正文

Apache Kafka 学习笔记

一、Kafka 简介

1.1 Kafka 是什么?

Kafka 是一个高吞吐、可扩展、分布式的消息发布-订阅系统,主要用于:

  • 日志收集与处理
  • 流式数据处理
  • 事件驱动架构
  • 实时分析管道

最初由 LinkedIn 开发,后捐赠给 Apache 基金会。


1.2 Kafka 的核心特性

特性描述
高吞吐每秒百万级消息处理能力,依赖顺序写磁盘、批量处理
分布式支持水平扩展,多个 Broker 组成集群
持久化消息写入磁盘(通过 segment files + offset 索引)
可伸缩支持动态添加分区与 Broker,无需停机
高可用分区副本机制 + controller 选主机制
解耦与异步通信生产者与消费者解耦,支持异步投递

二、Kafka 架构与核心组件

2.1 架构总览图

Producer --> [Broker1 | Broker2 | Broker3] --> Consumer Group↑         ↑Controller   Zookeeper / KRaft

2.2 核心组件说明

组件描述
Producer消息生产者,向指定 topic 写入消息
Consumer消息消费者,订阅 topic 并消费消息
BrokerKafka 节点,负责存储和转发消息
Topic消息分类,每个 topic 可分为多个分区(partition)
PartitionKafka 的并发和容错单元,每个分区在磁盘中为一个文件队列
Offset消费位置偏移量,表示某消费者读取到的位置
Consumer Group消费者组,每组共享消息消费(同组内消费者消费分区唯一)
ZookeeperKafka 早期使用的协调组件,用于选举 controller、存储元数据
ControllerKafka 集群的“领导者”,负责元数据管理、分区分配、故障恢复
KRaftKafka 自带的共识协议(Kafka 2.8+),用以替代 Zookeeper(单集群化)

三、Topic 与 Partition

3.1 Topic 创建与分区机制

kafka-topics.sh --create \
--bootstrap-server localhost:9092 \
--replication-factor 2 \
--partitions 3 \
--topic user-action
  • 分区(Partition)用于并行化数据存储和消费。
  • 每个分区的数据是有序的(append-only)。
  • 消息写入哪个分区:可指定 Key(哈希分配),或轮询自动分配。

四、Producer 原理与参数调优

4.1 生产流程

  1. 构造消息:指定 topic、key、value
  2. 序列化:将对象转为字节数组
  3. 分区器:选择写入分区
  4. 发送请求:异步投递至 Kafka Broker
  5. Broker 写磁盘:写入日志文件
  6. Producer 回调通知(成功或失败)

4.2 常用参数

参数含义默认值
acks写入确认级别(0, 1, all)1
retries失败重试次数0
batch.size批量发送消息大小(字节)16384
linger.ms批量等待时间0
compression.type消息压缩算法(gzip, lz4, snappy)none
buffer.memoryProducer 缓冲区总大小32MB

五、Consumer 原理与分组机制

5.1 消费者模型

  • 同一个 Consumer Group 内的多个消费者 分区独占消费
  • 不同 Group 可重复消费同一 Topic。

5.2 Rebalance(再平衡)

  • 组成员变化(新增、崩溃)时,Kafka 会重新分配分区。
  • 通过 协调器 协调分配。
  • 消费过程中会发生短暂中断。

5.3 消费 offset 管理

模式说明
自动提交自动定期提交(enable.auto.commit=true
手动提交开发者主动调用 commitSync/Async()
外部存储可存于 DB、Redis 等

六、Kafka 存储机制

6.1 数据文件结构

每个分区对应一组 Segment 文件:

/kafka-logs/user-action-0/- 00000000000000000000.log- 00000000000000000000.index- 00000000000000000000.timeindex
  • .log:存储数据
  • .index:offset 到物理位置的映射
  • .timeindex:时间戳索引

6.2 存储优化机制

技术描述
零拷贝(zero-copy)使用 sendfile() 系统调用,减少内核与用户态切换
页缓存(page cache)依赖操作系统缓存机制,避免频繁磁盘 I/O
顺序写入顺序写磁盘,性能远高于随机写入

七、Kafka 的高可用机制

7.1 分区副本

  • 每个分区可以配置多个副本(replica)。
  • Leader 副本 提供读写服务,Follower 副本 同步数据。
  • 默认仅 Leader 可读写,Follower 仅作为备份。

7.2 副本同步机制

  • ISR(In-Sync Replicas):

    • 表示“跟上 Leader 进度”的副本列表。
    • Producer 设置 acks=all 时需 ISR 全部成功才算成功。

7.3 控制器机制

  • Kafka 集群中选举一个 Controller,负责副本管理、分区迁移等操作。
  • 若 Controller 挂了,会自动重新选举(依赖 Zookeeper / KRaft)。

八、Kafka 实践指南

8.1 性能优化建议

优化项建议
Producer批量发送 + 压缩 + 异步发送
Consumer合理设置 poll() 周期,批量处理消息
Broker使用 SSD、高 IO 网卡,调优 segment 参数
Topic 分区数增加分区提升并发度(过多影响性能)

8.2 消息丢失与重复的处理策略

问题原因解决方式
消息丢失ack=0,未持久化设置 acks=all,启用副本同步机制
消息重复重试发送,Consumer 未提交偏移使用幂等设计、去重 ID 或外部事务控制

8.3 Kafka 与其他组件整合

系统用途
Flink实时数据流处理
Spark批处理/流处理
Elasticsearch实时搜索与分析
Hadoop/HDFS离线存储
Debezium数据库 CDC(变更捕获)

九、Kafka 常用命令

# 查看 Topic 列表
kafka-topics.sh --list --bootstrap-server localhost:9092# 查看 Topic 详情
kafka-topics.sh --describe --topic user-action --bootstrap-server localhost:9092# 创建 Topic
kafka-topics.sh --create --topic test --partitions 3 --replication-factor 2 --bootstrap-server localhost:9092# 发送消息
kafka-console-producer.sh --topic test --bootstrap-server localhost:9092# 消费消息
kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server localhost:9092

十、Kafka 版本演进(简略)

版本关键特性
0.9+引入权限控制(ACL)
0.10+加入时间戳、Kafka Streams
0.11+引入幂等 Producer、事务性消息(Exactly-once)
2.xKafka Connect + KRaft(后期)
3.x完全移除 Zookeeper,支持单集群管理(KRaft)

十一、总结图表

Kafka 消息流动图:

Producer↓
Partitioner → Topic → Partition (offset-ordered log)↓
Broker (磁盘持久化)↓
Consumer Group (Offset 管理 & 消费)
http://www.lryc.cn/news/593439.html

相关文章:

  • 详细阐述 TCP、UDP、ICMPv4 和 ICMPv6 协议-以及防火墙端口原理优雅草卓伊凡
  • Python高级数据类型:字典(Dictionary)
  • Datawhale 7月学习
  • RK3568 Linux驱动学习——SDK安装编译
  • Oracle为什么需要临时表?——让数据处理更灵活
  • DAY 18 推断聚类后簇的类型
  • 【Project】kafka+flume+davinci广告点击实时分析系统
  • MySQL(145)如何升级MySQL版本?
  • 在服务器(ECS)部署 MySQL 操作流程
  • 基于单片机宠物喂食器/智能宠物窝/智能饲养
  • 手撕Spring底层系列之:注解驱动的魔力与实现内幕
  • Spring AI 1.0版本 + 千问大模型之 文本记忆对话
  • 基于单片机病床呼叫系统/床位呼叫系统
  • C#操作WPS表格
  • 大模型军备竞赛升级!Grok 4 携 “多智能体内生化” 破局,重构 AI 算力与 Agent 2.0 时代
  • 张 关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导;
  • [MySQL基础3] 数据控制语言DCL和MySQL中的常用函数
  • 一个基于阿里云的C端Java服务的整体项目架构
  • 阿里云ssl证书自动安装及续订(acme)
  • NX二次开发常用函数——从一个坐标系到另一个坐标系的转换(UF_MTX4_csys_to_csys )相同体坐标转化
  • LRU算法及优化
  • SpringBoot五分钟快速入门指南
  • Java行为型模式---访问者模式
  • Nestjs框架: 理解 RxJS响应式编程的核心概念与实践
  • 如何构建未来的人-AI-环境智能教育生态系统
  • OpenCV 官翻 3 - 特征检测 Feature Detection
  • Vue 3 中导出 Excel 文件
  • 【Web APIs】JavaScript 自定义属性操作 ② ( H5 自定义属性 )
  • 光纤收发器上的指示灯各代表的含义
  • 【ChatOpenAI】常用方法详解