当前位置: 首页 > 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.dtcms.com/a/287478.html

相关文章:

  • FreeRTOS—列表和列表项
  • Kafka、RabbitMQ 与 RocketMQ 高可靠消息保障方案对比分析
  • 阿里云服务器 CentOS 7 安装 MySQL 8.4 超详细指南
  • UniApp 优化实践:使用常量统一管理本地存储 Key,提升可维护性
  • 【无标题】重点阅读——如何在信息层面区分和表征卷曲维度,解析黑洞内部的维度区分机制
  • 基于 Google Earth Engine 的 DEM 鞍部自动提取
  • 基于Python的毕业设计选题管理系统设计与实现
  • 【CAN通信】AUTOSAR架构下TC3xx芯片是如何将一帧CAN报文发送出去的
  • NX二次开发常用函数坐标转化UF_MTX4_csys_to_csys和UF_MTX4_vec3_multipl
  • Linux基础命令(第二期)
  • 地图定位与导航
  • Go-Redis × RediSearch 全流程实践
  • Node.js:Stream、模块系统
  • KANO模型分类,以扫地机功能为例子
  • 实验-华为综合
  • 论文略读: RASA: RANK-SHARING LOW-RANK ADAPTATION
  • 《Linux系统配置实战:NTP时间同步与SSH免密登录全流程指南》​​
  • 【洛谷】询问学号、寄包柜、移动零、颜色分类(vector相关算法题p1)
  • LVS(Linux virual server)基础概念详解
  • 网络通信原理:分层协作与协议解析
  • Matplotlib 30分钟精通
  • 免费收听广播
  • C++类和对象(一)基础内容讲解
  • 使用uvx运行和安装Python应用程序
  • GEO营销:AI时代的搜索优化新赛道——从DeepSeek爆火看生成式引擎优化的崛起
  • 边界条件汇总
  • 初等数论Ⅱ
  • Spring监听器
  • (LeetCode 面试经典 150 题) 49. 字母异位词分组 (哈希表)
  • 开疆智能Profinet转ModbusTCP网关连接康耐视InSight相机案例