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

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),确保跨分区或跨批次的消息要么全部成功,要么全部失败

启用事务时:

  1. 生产者调用 initTransactions() 初始化事务。
  2. 生产者调用 beginTransaction() 开始事务。
  3. 生产者发送消息。
  4. 生产者调用 commitTransaction() 提交事务,或 abortTransaction() 回滚事务。

最佳实践:

  • 事务适用于涉及多个 Topic 或多个分区的消息处理场景,如金融系统、订单系统
  • 事务模式下,必须启用 acks=allenable.idempotence=true

2. 消费者一致性保证

Kafka 消费者一致性主要涉及:

  1. 消息不丢失(At-Least-Once)
  2. 消息不重复(At-Most-Once)
  3. 精准一次消费(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 发生后,某些未提交偏移量的消息未处理完。

最佳实践:

  • 使用 StickyAssignorCooperativeStickyAssignor,减少 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 提供了三种列表类型&#xff1a; 无序列表 (Unordered List)&#xff1a;使用 <ul> 标签定义&#xff0c;列表项使用 <li> 标签定义。默认情况下&#xff0c;列表项前面会显示黑色圆点。有序列表 (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提供了多种方式来配置和使用线程池&#xff0c;最常见的是通过TaskExecutor和ThreadPoolTaskExecutor。 Spring线程池 TaskExecutor 接口 TaskExecutor 是Spring框架中的一个接口&#xff0c;它是对Java的Executor接口的简单封装。它的主要目的是为了提供一个统一的接口…...

ArcGIS操作:08 计算shp面积并添加到属性表

1、打开属性表 注意&#xff1a;计算面积前&#xff0c;需要把shp的坐标系转化为投影坐标系&#xff08;地理坐标系用于定位、投影坐标系用于测量&#xff09; 2、创建字段 3、编辑字段名、类型 4、选择字段&#xff0c;计算几何 5、选择属性、坐标系、单位...

安卓音频框架混音器

在 Android 音频框架中&#xff0c;混音器&#xff08;Mixer&#xff09; 是 AudioFlinger 服务的核心组件之一&#xff0c;负责将多个音频流&#xff08;来自不同应用或系统组件&#xff09;混合为统一的输出流&#xff0c;再传输到音频硬件设备&#xff08;如扬声器、耳机等&…...

左值引用与指针的区别

很多朋友遇到过这个问题&#xff1a;左值引用与指针有哪些区别&#xff1f;脑子里闪过很多答案&#xff0c;但大部分都是各自的定义&#xff0c;真要说他们两个有什么区别&#xff0c;有的时候还这是说不上来。本文针对这个问题进行归纳总结&#xff0c;希望对大家有所帮助。 …...

Linux基础使用和程序部署

目录 1.Linux 1.2 Linux的环境搭配 1.2.1 使用云服务器 1.2.2使用终端软件连接到Linux 1.3. Linux 常用命令 1. ls&#xff1a;列出当前目录中的文件和子目 2.pwd&#xff1a;显示当前工作目录的路径 3.cd&#xff1a;改变工作目录&#xff0c;将当前的工作目录改变到指定目…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...