Kafka底层结构
1. Kafka 架构总览
Kafka 是一个分布式消息队列,采用**发布-订阅(Pub-Sub)**模式,核心组件包括:
- Producer(生产者): 负责向 Kafka 发送消息。
- Broker(Kafka 服务器): 负责存储和管理消息。
- Topic(主题): 消息的分类单元。
- Partition(分区): Topic 的物理分片,提高吞吐量。
- Consumer(消费者): 订阅并消费消息。
- Consumer Group(消费者组): 消费者的逻辑分组,支持并行消费。
- Zookeeper: 负责 Kafka 集群的元数据管理、Leader 选举等。
2. 底层存储结构
Kafka 采用顺序写入日志文件的方式存储数据,底层存储采用**Segment(日志分段)+ Index(索引)**的方式管理数据。
2.1 日志存储
-
每个 Partition 对应一个日志目录,目录结构如下:
/kafka-logs/├── topic-1/│ ├── 0/ # 分区0│ │ ├── 00000000000000000000.log # 日志文件│ │ ├── 00000000000000000000.index # 索引文件│ │ ├── 00000000000000000000.timeindex # 时间索引文件│ │ ├── leader-epoch-checkpoint # 领导者任期记录
-
日志分段(Segment)
- Kafka 不会将所有消息存入一个文件,而是拆分成多个段文件(Segment),每个 Segment 都是一个固定大小(默认1GB)的日志文件。
- 新消息总是追加到当前活跃段(Active Segment),当文件达到一定大小后,Kafka 会新建一个段文件。
-
索引机制
- 索引文件(.index): 记录消息在日志文件中的偏移量和物理位置。
- 时间索引(.timeindex): 通过时间戳查找最近的消息,提高查询效率。
2.2 日志清理(Log Retention & Compaction)
Kafka 提供两种清理策略:
- 日志保留(Retention): Kafka 按照**时间(log.retention.hours)或大小(log.retention.bytes)**删除旧数据,默认存储 7 天。
- 日志压缩(Log Compaction): 仅保留最新的 Key-Value 记录,适用于 幂等性数据存储 场景。
3. 生产者消息投递
生产者(Producer)负责将消息发送到 Kafka,Kafka 采用以下机制保证消息可靠性:
-
分区策略(Partitioning)
- 轮询(Round-Robin): 生产者将消息平均分配到不同的分区。
- 按 Key 选择(Keyed Partitioning): 生产者根据 Key 计算 Hash 值,映射到固定分区,保证相同 Key 的消息进入同一个分区。
- 自定义策略(Custom Partitioning): 用户可以自定义分区规则。
-
消息确认机制(Acknowledgment)
acks=0:不等待确认,可能丢失数据。acks=1:只需 Leader 记录消息,可能丢失数据(Leader 崩溃)。acks=all:所有副本都写入后才确认,保证最高可靠性。
-
批量发送(Batching)
- Kafka 生产者默认支持批量发送(Batch),提高吞吐量。
- 通过参数
batch.size控制批量大小。
-
压缩(Compression)
- Kafka 支持 GZIP、Snappy、LZ4、Zstd 压缩方式,减少带宽占用。
4. 消费者消费机制
消费者从 Kafka 拉取数据,采用 Consumer Group(消费者组) 机制保证数据分发:
- 每个分区只能被一个组内的消费者消费,保证同一条消息不会被组内多个消费者重复消费。
- 不同的 Consumer Group 可以并行消费同一 Topic,提高并发能力。
4.1 消息拉取方式
Kafka 采用Pull(拉取)模式,而非传统的Push(推送)模式:
- Push 模式:生产者主动推送数据,可能导致消费者过载。
- Pull 模式:消费者自主决定拉取频率,避免过载问题,提高吞吐量。
4.2 消费者偏移量(Offset)管理
Kafka 使用消费者位移(Offset) 记录消费进度:
- 自动提交(enable.auto.commit=true): 消费者定期提交偏移量,可能丢失数据。
- 手动提交: 通过
commitSync()或commitAsync()提交偏移量,保证消费的可靠性。
4.3 Rebalance 机制
当消费者加入/退出消费者组,Kafka 会进行重新分配分区(Rebalance):
- Rebalance 触发条件
- 新消费者加入
- 消费者故障
- 分区数变化
5. 分区副本(Replication)机制
Kafka 采用副本机制(Replication) 保证数据高可用:
-
每个分区都有多个副本(Replica),其中:
- Leader 副本 负责读写数据。
- Follower 副本 仅做同步,供故障转移使用。
-
ISR(In-Sync Replicas)同步机制
- Kafka 维护同步副本集合(ISR),存储最新的同步副本。
- 仅 ISR 内的副本能当选 Leader,保证数据一致性。
-
副本选举(Leader Election)
- 当 Leader 崩溃,Kafka 会自动选举新的 Leader,保证服务可用。
6. 高吞吐设计
Kafka 采用多种优化策略,提高吞吐能力:
- 零拷贝(Zero-Copy)
- 采用 sendfile 系统调用,避免数据在用户态和内核态之间拷贝,提高性能。
- 顺序写入
- Kafka 采用顺序写入磁盘,减少随机 IO,提升写入速度。
- 批量处理
- 生产者批量发送消息,减少网络开销,提高吞吐量。
7. Zookeeper 在 Kafka 中的作用
Kafka 依赖 Zookeeper 进行集群管理,主要包括:
- 存储元数据
- 记录 Topic、分区、副本等信息。
- 选举 Kafka Controller
- 控制分区的 Leader 选举,维护集群状态。
- 消费者 Rebalance
- 协调 Consumer Group,触发 Rebalance。
一致性设计
1. 生产者一致性保证
生产者一致性主要涉及数据是否成功写入 Kafka,并且不会丢失或重复,Kafka 提供以下机制来保证生产者一致性:
1.1 ACK 确认机制
Kafka 生产者在发送消息时,依赖 acks 参数来确认数据是否成功写入 Kafka:
acks=0:不等待确认,最快,但可能会丢失数据(不一致)。acks=1:只等待Leader 副本确认,存在 Leader 崩溃导致数据丢失的风险。acks=all(或acks=-1):等待所有 ISR 副本确认,确保数据不会丢失,但写入延迟较高。
✅ 最佳实践:
- 对于高一致性要求,建议使用
acks=all。 - 可结合
min.insync.replicas配置,确保至少有 N 个副本 成功写入后才确认。
1.2 生产者重试机制
Kafka 生产者可能因网络问题、Broker 宕机等原因发送失败。Kafka 通过重试机制提高数据一致性:
retries=N:指定重试次数。retry.backoff.ms:两次重试之间的时间间隔。
⚠️ 注意:
- 若
retries > 0,但max.in.flight.requests.per.connection > 1,可能导致消息乱序。 - 解决方案:
- 保证消息顺序:设置
max.in.flight.requests.per.connection=1。
- 保证消息顺序:设置
✅ 最佳实践:
- 对于幂等性保证,需配合
enable.idempotence=true(见下一节)。 retries设为较大值(如retries=5),避免短期故障导致数据丢失。
1.3 幂等性(Idempotency)
Kafka 生产者默认情况下可能会在重试过程中导致重复消息,可以启用幂等性保证数据一致性:
enable.idempotence=true:Kafka 生产者端启用幂等性,确保同一条消息只写入一次,即使发生重试。
Kafka 通过Producer ID(PID)+ Sequence Number 组合,确保相同 Producer 发送的消息不会被重复写入。
✅ 最佳实践:
- 强烈建议在高一致性场景下启用幂等性
enable.idempotence=true。 acks=all+enable.idempotence=true可实现**"Exactly Once"(精准一次)** 语义。
1.4 事务保证(Exactly-Once)
Kafka 生产者支持事务(Transactional),确保跨分区或跨批次的消息要么全部成功,要么全部失败。
启用事务时:
- 生产者调用
initTransactions()初始化事务。 - 生产者调用
beginTransaction()开始事务。 - 生产者发送消息。
- 生产者调用
commitTransaction()提交事务,或abortTransaction()回滚事务。
✅ 最佳实践:
- 事务适用于涉及多个 Topic 或多个分区的消息处理场景,如金融系统、订单系统。
- 事务模式下,必须启用
acks=all和enable.idempotence=true。
2. 消费者一致性保证
Kafka 消费者一致性主要涉及:
- 消息不丢失(At-Least-Once)
- 消息不重复(At-Most-Once)
- 精准一次消费(Exactly-Once)
Kafka 通过消费偏移量(Offset)管理和事务消费等机制实现不同级别的一致性保证。
2.1 消费者偏移量(Offset)管理
Kafka 采用**偏移量(Offset)**来记录消费者消费的进度,Kafka 提供三种消费语义:
| 语义 | 解释 | 偏移提交时机 | 可能的问题 |
|---|---|---|---|
| At-Most-Once(最多一次) | 可能丢失消息,但不重复 | 在消费前提交 | 失败后消息丢失 |
| At-Least-Once(至少一次) | 确保不丢失,但可能重复 | 在消费后提交 | 失败可能导致重复消费 |
| Exactly-Once(精准一次) | 消费恰好一次 | 事务消费 + 幂等性 | 需要事务支持 |
✅ 最佳实践:
- 默认 Kafka 消费是 At-Least-Once,即消费后提交偏移量,可能导致重复消费。
- 避免重复消费:
- 可结合 幂等性 机制(如数据库
UPSERT操作)。 - 使用事务消费(见下一节)。
- 可结合 幂等性 机制(如数据库
2.2 事务消费(Exactly-Once)
Kafka 事务消费(Exactly-Once Processing,EoS)保证消费者端的精准一次处理:
read_process_commit原子性- 事务保证了读取、处理和提交偏移量要么全部完成,要么全部失败。
- Kafka Streams API
- Kafka Streams 提供内置Exactly-Once 语义,自动处理事务提交。
✅ 最佳实践:
- 使用 Kafka Streams 进行 EoS 消费(推荐)。
- 如果用普通消费者:
enable.auto.commit=false,手动提交偏移量。- 结合
commitSync()和事务commitTransaction()共同确保一致性。
2.3 Rebalance 影响一致性
当 Consumer Group 发生**Rebalance(重新分配分区)**时,可能导致:
- 重复消费:如果 Rebalance 发生在偏移量提交前,可能导致部分消息重复消费。
- 消息丢失:如果 Rebalance 发生后,某些未提交偏移量的消息未处理完。
✅ 最佳实践:
- 使用
StickyAssignor或CooperativeStickyAssignor,减少 Rebalance 影响。 - 手动提交偏移量(commitSync),确保处理完数据后才提交。
总结
| 机制 | 生产者一致性 | 消费者一致性 |
|---|---|---|
| ACK 机制 | acks=all 确保数据写入成功 | - |
| 重试机制 | retries>0,避免瞬时失败 | - |
| 幂等性 | enable.idempotence=true,防止重复写入 | - |
| 事务 | beginTransaction() + commitTransaction() | read_process_commit 事务消费 |
| 偏移量管理 | - | enable.auto.commit=false + commitSync() |
| Rebalance 处理 | - | 使用 StickyAssignor 方案减少影响 |
✅ 最终推荐方案:
- 生产者:
acks=all+enable.idempotence=true+transactional.id - 消费者:
enable.auto.commit=false+commitSync()+ 事务消费
这些优化方案可以保证 Kafka "Exactly-Once"(精准一次) 语义,确保生产者和消费者数据一致性。
相关文章:
Kafka底层结构
1. Kafka 架构总览 Kafka 是一个分布式消息队列,采用**发布-订阅(Pub-Sub)**模式,核心组件包括: Producer(生产者): 负责向 Kafka 发送消息。Broker(Kafka 服务器&…...
[BUUCTF]web--wp(持续更新中)
ps:文章所引用知识点链接,如有侵权,请联系删除 [极客大挑战 2019]EasySQL 题目类型:简单SQL注入 发现是登录页面,用万能登录方法测试,两种语句均能解出flag [极客大挑战 2019]Havefun 题目类型:代码审计…...
axios请求设置request umijopenai生产前端请求 ts状态全局 v-if v-else 与动态js变量
axios请求 安装 npm install axios全局自定义请求 集中处理设置 集体通用请求 example const instance axios.create({baseURL: https://some-domain.com/api/,timeout: 1000,headers: {X-Custom-Header: foobar} });请求前 请求后 拦截器 // 添加请求拦截器 axios.in…...
SparkSQL全之RDD、DF、DS ,UDF、架构、资源划分、sql执行计划、调优......
1 SparkSQL概述 1.1 sparksql简介 Shark是专门针对于spark的构建大规模数据仓库系统的一个框架Shark与Hive兼容、同时也依赖于Spark版本Hivesql底层把sql解析成了mapreduce程序,Shark是把sql语句解析成了Spark任务随着性能优化的上限,以及集成SQL的一些…...
深入理解Linux内存缓存:提升性能的关键
在深入探索 Linux 系统的奇妙世界时,内存管理无疑是一个至关重要的领域。而在 Linux 内存体系中,Cache 扮演着举足轻重的角色。它就像是一位默默奉献的幕后英雄,为系统的高效运行立下汗马功劳。那么,Linux 内存中的 Cache 究竟是什…...
STM32-FOC-SDK包含以下关键知识点
STM32-FOC-SDK(Field-Oriented Control - Software Development Kit)是专为STM32微控制器设计的一套软件开发工具,用于实现电机控制的磁场定向控制(Field Oriented Control,简称FOC)。STM32是一款基于ARM C…...
sql调优:优化响应时间(优化sql) ; 优化吞吐量
Sql性能调优的目的 1.优化响应时间>>优化sql 经过调优后,执行查询、更新等操作的时候,数据库的反应速度更快,花费的时间更少。 2.优化吞吐量 即“并发”, 就是“同时处理请求”的能力。 优化sql 尽量将多条SQL语句压缩到一句>…...
【Mybatis】如何简单使用mybatis-plus,以及MybatisGenerator自动生成或者实现SQL语句
前言 🌟🌟本期讲解关于mybatis中SQL自动生成的相关知识介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆…...
Halcon 车牌识别-超精细教程
车牌示例 流程: 读取图片转灰度图阈值分割,找车牌内容将车牌位置设置变换区域形状找到中心点和弧度利用仿射变换,斜切车牌旋转转正,把车牌抠出来利用形态学操作拼接车牌号数字训练ocr开始识别中文车牌 本文章用到的算子(解析) Halcon 算子-承接车牌识别-CSDN博客 rgb1_to_gray…...
LeetCode 25 - K 个一组翻转链表
LeetCode 25 - K 个一组翻转链表 这道题是一个典型的链表操作题,考察我们对链表的精确操作,包括反转链表、分组处理、递归和迭代的结合应用等。还可以通过变体问题延伸到优先队列操作、归并、分块等,这使得它成为面试中的高频考题之一。 题目…...
一文读懂智能硬件定位:开启智能时代的精准导航
一、智能硬件定位是什么 (一)基本概念阐述 智能硬件定位,本质上是智能硬件依托一系列特定技术手段,精准测定自身所处地理位置的过程。这一实现过程离不开诸多关键技术的支撑。传感器堪称其中的 “排头兵”,像加速度计…...
夸父工具箱(安卓版) 手机超强工具箱
如今,人们的互联网活动日益频繁,导致手机内存即便频繁清理,也会莫名其妙地迅速填满,许多无用的垃圾信息悄然占据空间。那么,如何有效应对这一难题呢?答案就是今天新推出的这款工具软件,它能从根…...
Html5学习教程,从入门到精通,HTML5 列表语法知识点及案例代码(11)
HTML 列表语法知识点及案例代码 一、HTML 列表类型 HTML 提供了三种列表类型: 无序列表 (Unordered List):使用 <ul> 标签定义,列表项使用 <li> 标签定义。默认情况下,列表项前面会显示黑色圆点。有序列表 (Ordere…...
内核进程调度队列(linux的真实调度算法) ─── linux第13课
目录 内核进程调度队列的过程 一个CPU拥有一个runqueue(运行队列在内存) 活动队列(active) 过期队列(expired) active指针和expired指针 重绘runqueue linux内核O(1)调度算法 总结 补充知识: 封装链式结构的目的是: 仅使用封装链式结构可以得到全部的task_struct的信…...
16.7 LangChain LCEL 极简入门:Prompt + LLM 的黄金组合
LangChain LCEL 极简入门:Prompt + LLM 的黄金组合 关键词:LCEL 基础示例、Prompt 模板设计、LLM 集成、链式调用、LangChain 快速上手 1. 基础架构解析:Prompt → LLM → Output 1.1 核心组件交互流程 #mermaid-svg-pv3fH3mEKyE4TNaF {font-family:"trebuchet ms&qu…...
Spring线程池学习笔记
Spring提供了多种方式来配置和使用线程池,最常见的是通过TaskExecutor和ThreadPoolTaskExecutor。 Spring线程池 TaskExecutor 接口 TaskExecutor 是Spring框架中的一个接口,它是对Java的Executor接口的简单封装。它的主要目的是为了提供一个统一的接口…...
ArcGIS操作:08 计算shp面积并添加到属性表
1、打开属性表 注意:计算面积前,需要把shp的坐标系转化为投影坐标系(地理坐标系用于定位、投影坐标系用于测量) 2、创建字段 3、编辑字段名、类型 4、选择字段,计算几何 5、选择属性、坐标系、单位...
安卓音频框架混音器
在 Android 音频框架中,混音器(Mixer) 是 AudioFlinger 服务的核心组件之一,负责将多个音频流(来自不同应用或系统组件)混合为统一的输出流,再传输到音频硬件设备(如扬声器、耳机等&…...
左值引用与指针的区别
很多朋友遇到过这个问题:左值引用与指针有哪些区别?脑子里闪过很多答案,但大部分都是各自的定义,真要说他们两个有什么区别,有的时候还这是说不上来。本文针对这个问题进行归纳总结,希望对大家有所帮助。 …...
Linux基础使用和程序部署
目录 1.Linux 1.2 Linux的环境搭配 1.2.1 使用云服务器 1.2.2使用终端软件连接到Linux 1.3. Linux 常用命令 1. ls:列出当前目录中的文件和子目 2.pwd:显示当前工作目录的路径 3.cd:改变工作目录,将当前的工作目录改变到指定目…...
【ZGC性能调优终极指南】:20年JVM专家亲授5大实战瓶颈突破法
第一章:ZGC核心机制与性能边界全景透视ZGC(Z Garbage Collector)是JDK 11引入的低延迟垃圾收集器,专为处理TB级堆内存与毫秒级停顿目标而设计。其核心突破在于并发标记、并发重定位与着色指针(Colored Pointers&#x…...
从播放卡顿到流媒体优化:深入MP4的stbl盒子,理解视频流畅播放的关键
从播放卡顿到流媒体优化:深入MP4的stbl盒子,理解视频流畅播放的关键 当你在深夜调试一个在线视频播放器,发现用户总是抱怨卡顿和拖拽不准时,是否曾思考过问题可能隐藏在MP4文件最核心的stbl盒子中?作为流媒体开发者&am…...
小白也能搞定:CYBER-VISION零号协议智能助盲系统部署全流程
小白也能搞定:CYBER-VISION零号协议智能助盲系统部署全流程 1. 系统介绍与准备工作 CYBER-VISION零号协议是一款专为视障人士设计的智能助盲系统,它通过先进的计算机视觉技术,将周围环境实时转化为可理解的语音提示。想象一下,当…...
Python打包神器大PK:Nuitka vs PyInstaller,谁才是你的菜?(附实测数据)
Python打包工具深度评测:Nuitka与PyInstaller的终极对决 当开发者需要将Python项目分发给没有Python环境的用户时,打包工具的选择往往成为关键决策。本文将深入分析两大主流工具Nuitka和PyInstaller在多个维度的表现,帮助开发者根据项目需求做…...
实测Qwen3-4B:256K超长上下文,处理长文档、写长文真实案例
实测Qwen3-4B:256K超长上下文,处理长文档、写长文真实案例 1. 引言:为什么关注长上下文能力 在日常工作和创作中,我们经常遇到需要处理超长文档的场景:分析上百页的PDF报告、阅读整本电子书、编写长篇技术文档等。传…...
Word文档自动更新日期技巧
设置Word文档自动显示当天日期打开Word文档后,可以通过插入日期字段实现每次打开时自动更新为当天日期。方法1:使用日期字段在Word文档中定位光标到需要显示日期的位置。点击菜单栏"插入"→"文本"→"日期和时间"。在弹出的…...
Java 26 FFM API进阶:零JNI调用TensorRT/OpenVINO,AI端到端延迟砍半
文章目录一、JNI,AI时代的"文言文写作"二、FFM API:Java调用原生代码的"现代白话文"1. Arena:比try-with-resources还狠的内存管理2. Linker:C函数的"Java身份证"3. jextract:头文件自动…...
工业以太网双雄:从协议原理到选型落地,EtherCAT与PROFINET实战解析
1. 工业以太网的双雄之争:为什么选型这么难? 第一次接触工业以太网协议选型时,我盯着EtherCAT和PROFINET的参数表发呆了整整一上午。就像面对两个各有所长的武林高手,一个轻功了得,一个内力深厚,实在难以抉…...
Qwen3-TTS-VoiceDesign应用案例:智能硬件设备嵌入式多语种语音播报
Qwen3-TTS-VoiceDesign应用案例:智能硬件设备嵌入式多语种语音播报 1. 智能语音播报的市场需求 现在的智能硬件设备越来越普及,从智能家居到车载系统,从工业设备到消费电子产品,几乎都需要语音交互功能。但很多设备面临一个共同…...
Clawdbot惊艳效果:Qwen3-32B在医疗问诊摘要与术语标准化输出实测
Clawdbot惊艳效果:Qwen3-32B在医疗问诊摘要与术语标准化输出实测 1. 测试背景与平台介绍 Clawdbot是一个统一的AI代理网关与管理平台,为开发者提供直观的界面来构建、部署和监控自主AI代理。这个平台集成了聊天界面、多模型支持和强大的扩展系统&#…...
