二 kafka架构介绍

学习一个系统之前很重要的一点就是先了解这个系统整体的架构,这能够使我们对整个系统有个总体的认识,清楚地知道这个系统有什么能力。这不仅帮助我们学习时快速定位到我们想要的内容,还能避免我们学习过程中在庞大的系统中迷失自己。所以首先我会介绍一下kafka的整体架构,包括这个kafka系统的整体架构,模块组成,模块的功能以及模块之间关系,以及各个模块之间是怎么共同构成这套系统的。kafka官方并不直接提供他们源码的架构图,模块功能和边界,所以这块的内容是我根据kafka各模块的功能,依赖关系自己组织起来的,并且对各模块做了分层方便我们学习。

2.1 kafka架构和模块

kafka4整体由21个模块组成,但是kafka并不像spring那样采用严格的分层架构,模块的划分设计主要还是为了尽可能复用代码并且避免模块直接引入其他不需要的代码,然后很多kafka官方工具和客户端/API的源码也会放在单独的模块中管理。这里我们文章关心的主要kafka broker相关的源码。对于客户端,工具等的代码不会做太多介绍。但是也有必要做一些简单介绍提升我们对于kafka的整体认知,下面简单贴一下kafka4.1的源码,里面就能够清楚地看到我们下面会说地21个模块了。

尽管kafka没有严格地对模块进行分层,这里还是根据各个模块的功能和依赖关系对各个模块进行了归类和分层。以下就是kafka的架构图。

首先最底层的通用模块就是server-common了,这个模块主要负责定义kafka通用抽象,常量和封装公共方法等,kafka服务的其他模块都会依赖这个模块减少代码冗余,除此之外还有负责数据持久化的storage模块。为其他模块提供持久化数据的管理。

然后就是元数据于协调模块,这些模块主要封装了集群内各broker,组内各消费者,事务内各生产者和broker的行为协调逻辑,实现broker分区分配,消费者分区分配和kafka事务的功能,之所以吧元数据和协调放在同一层,是因为metadata模块既封装了元数据相关的管理操作,也实现了集群内broker的协调逻辑,同时其他协调器也会依赖metadata模块的元数据来完成自己的协调功能。如果单独划出元数据层的话,就会错误地忽略掉metadata模块对集群broker协调作用。同时coordinator-common和share-coordinator模块并不是独立的协调器实现,它们只是封装了协调器会用到的公共抽象和通用逻辑,减少代码冗余。与元数据于协调模块同层的就是负责实现kraft逻辑的raft模块了,其实我们也可以认为它也是一个协调模块,负责kraft集群内机器的协调管理。

再往上就是基础服务模块server了,很多可能被他的名字迷惑,觉得是在server里面完成的kafka broker的实现逻辑,其实这是错误的,server主要就是依赖于上面的模块实现了服务通用功能,这些功能并不是Kafka专有的,其他大多数服务都有这些功能,比如服务埋点和监控,配额管理,副本管理等,Kafka把这些逻辑抽离出到server模块上,让core模块能够专心实现Kafka核心的功能。

然后就到了我们的核心模块core了,它依赖其他模块实现了kafka的broker,存放broker的入口程序和核心逻辑,也会调用其他模块完成broker整体的工作。kafka的核心组件acceptor,processor,handler,kafkaApis,requestchannel都是在这里定义和实现的。

然后就是kafka的客户端,工具,脚本和测试模块了,它们都相对比较独立,都是kafka官方提供的方便我们使用,测试kafka的工具。当然kafka也有一些其他的社区维护的工具或者客户端,这里我们就不做太多赘述了。

2.2 模块功能

我们在这个小节会简单介绍一下kafka各个模块,尽管有些模块并不是本文章的的内容,但是还是有必要对他们有个概念,这也能让我们更加有底气地打开kafka源码。

2.2.1 基础层

我们把kafka中提供基础能力的模块划分为基础层,基础层的模块为我们的kafka服务提供通用的抽象和一些常用功能的封装。减少代码冗余性。

server-common模块

server-common 模块为 Kafka 服务端(Broker)相关的多个子系统提供通用的基础设施、工具类和抽象接口。主要就是将多处复用的通用逻辑抽取出来,避免出现代码冗余,提升代码的可维护性。

storage模块

storage模块是Kafka服务端消息持久化存储的核心实现,为Kafka的高吞吐、高可靠消息存储提供底层支撑。它实现了Kafka分区日志的写入、读取、分段、索引、清理、事务、快照等所有与磁盘存储相关的功能,比如管理分区日志(Log)的写入、读取、分段、索引、清理、压缩、删除和消息的物理存储、索引文件、事务索引、快照,支持日志的恢复、截断、校验、异常处理等等。

2.2.2 元数据与协调/协议层

元数据与协调模块负责实现kafka体系内元数据的管理和节点之间的协调逻辑,比如协调消费者组里面的消费者分配某个topic的分区,协调多个broker怎么分配某个topic的分区,协调事务里面的生产者和broker的工作等等。

metadata模块

metadata模块是Kafka服务端集群元数据管理的核心实现,为Kafka的高可用、分布式一致性和动态扩展提供底层支撑。它实现了Kafka集群中所有元数据(如主题、分区、副本、Broker、控制器、ACL、特性等)的存储、更新、分发和管理,以及Controller和Broker的注册和心跳管理,Topic分区分配,迁移等一系列基于元数据的决策逻辑。Metadata模块也是KRaft(Kafka Raft)架构下去中心化元数据管理的基础,提供了KRaft相关元数据的管理,同时它也需要依赖raft模块实现元数据的分布式一致性存储和同步。是Kafka实现高可用和弹性伸缩的关键。

coordinator-common模块

coordinator-common 模块为 Kafka 中所有协调器模块(比如消费组协调器Group Coordinator和事务协调器Transaction Coordinator)提供通用的抽象、工具和基础设施,包括接口、抽象类、工具方法,以及协调器的通用配置、状态管理和持久化等基础能力。它并不直接实现消费组或事务协调的具体逻辑,而是作为消费组协调器Group Coordinator,事务协调器Transaction Coordinator等协调器模块的公共支撑,避免重复实现。

share-coordinator模块

share-coordinator 模块为 Kafka 中的多种协调器(如消费组协调器、事务协调器等)提供共享的实现基础。它在coordinator-common的基础上进一步抽象和复用协调器之间的通用行为或逻辑,比如封装协调器Coordinator之间的通用实现,如状态管理、持久化、协议处理等,提供协调器的抽象基类、接口和工具方法。便于不同类型的协调器共享代码、减少代码冗余。

group-coordinator模块

group-coordinator模块专门实现Kafka消费组协调器的全部功能。它负责管理消费组成员、分区分配、再平衡、消费位移提交等,包括实现管理消费组成员的加入、离开、心跳,实现分区分配、再平衡、消费位移提交与查询,处理消费组相关的协议请求(如JoinGroup、SyncGroup、Heartbeat、OffsetCommit等)等的逻辑,是Kafka高可靠消费和负载均衡的核心。

注意group-coordinator模块的分区分配是指把分区分配给消费者组的消费者,前面metadata模块的分区分配是指把分区分配给不同broker,两边的工作职责不一样,不要弄混。

transaction-coordinator模块

transaction-coordinator模块专门实现Kafka的事务协调器功能。它负责管理生产者的事务生命周期,实现幂等性、事务状态机、事务超时、提交/中止等,实现了管理生产者事务的初始化、提交、终止,维护事务状态机,处理事务超时、恢复,处理事务相关的协议请求(如InitProducerId、AddPartitionsToTxn、EndTransaction等)等逻辑,是Kafka支持Exactly Once语义的关键。

raft模块

raft模块是Kafka实现KRaft(Kafka Raft)协议的核心模块,为Kafka集群提供分布式一致性、高可用和去中心化的元数据管理能力。它实现了Raft分布式一致性协议的全部核心机制,包括Raft协议实现(日志复制、选主(Leader Election)、日志提交、快照、成员变更等),分布式一致性保障,高可用与容错,动态成员管理等等。除此之外raft模块也为metadata、controller等模块提供一致性存储和同步能力,raft是KRaft架构下Kafka元数据存储和同步的基础。替代了原有的ZooKeeper方案

2.2.3 基础服务模块

服务基础层的模块负责提供kafka服务运行时需要的一些基础能力,比如数据埋点和监控,权限控制,限流,这些能力虽然不是kafka的核心实现逻辑但是也是kafka运行必不可少的一部分。

server模块

server模块可以理解为core模块的基础设施库,server模块为Kafka Broker的主服务实现提供了大量的基础能力和子系统实现,包括副本管理、分区分配、指标采集、配额管理、事务支持、延迟操作、日志控制等,这些能力一般是大多数平台都具有的能力而不仅仅是kafka特有的,所以通过将这些通用能力抽离到server模块,主服务实现可以更专注于流程控制和集成,提升了代码的解耦性和可维护性。

2.2.4 broker实现层

这个就是kafka broker的核心逻辑的地方了

core模块

core模块是Kafka的核心实现模块,主要负责Kafka服务端的启动、运行、关闭等主流程控制。它包含了Kafka Broker的主入口、定义和实现了Server,Processor,RequestChannel,KafkaApis等实现Kafka功能的核心组件,实现了服务生命周期管理(启动、关闭、异常处理等)、加载和解析服务端配置,请求的实际处理,服务指标监控等的逻辑。

2.2.5 客户端与API

这些严格意义不算是kafka服务里面的代码,只是官方提供一些对接kafka服务的客户端或者简化kafka使用流程的依赖库。除了官方提供的外我们也可以在社区里面找到很多好用的kafka客户端或者调用框架。

clients模块

clients模块提供Kafka的Java客户端实现,包括生产者,消费者,管理客户端等,供外部应用集成以便于与kafka交互。比如业务服务在引入clients模块后可以很方便地使用KafkaProducer给topic发送消息,使用KafkaConsumer接受并处理感兴趣的topic的消息,使用AdminClient对kafka broker的主题、分区、ACL等进行管理,比如创建或删除topic,获取集群消息等等。

streams模块

streams模块就是对Kafka Streams的实现,Kafka Streams是Apache Kafka官方提供的一个轻量级、分布式、高容错的流处理库,我们可以在Java应用中引入streams模块后很方便地实现对Kafka数据流的实时处理、分析和计算。而且Kafka Streams也支持支持窗口、聚合、连接等流式操作。使用Kafka Streams我们能够很方便地无缝对接Kafka数据进行实时的统计,监控,ETL,数据清洗,实时告警,风控等操作。

connect模块

connect模块实现了Kafka Connect框架,Kafka Connect是Apache Kafka官方提供的一个分布式、可扩展、可管理的数据集成框架。它的主要目标是简化Kafka与外部系统(如数据库、文件系统、云存储、搜索引擎等)之间的数据同步和批量数据流转,让用户无需编写复杂的代码就能实现数据的高效导入和导出。主要提供以下支持。

数据源(Source)到Kafka:自动化地将外部系统(如MySQL、PostgreSQL、Oracle、文件、云存储等)中的数据批量导入Kafka Topic。

Kafka到数据汇(Sink):自动化地将Kafka Topic中的数据批量导出到外部系统(如Elasticsearch、HDFS、S3、数据库等)

数据转换与处理:支持在数据流转过程中进行格式转换、字段过滤、数据清洗等操作(通过Transform机制)。

分布式与容错:支持分布式部署、自动负载均衡、任务容错、状态管理、动态扩缩容等

2.2.6 工具与脚本

这些是kafka官方提供的一些工具,用于帮助管理kafka或者做一些数据诊断,性能校验,又或者是支持kafka提供的脚本等,这些工具有些是kafka内部开发人员会用的,有些是使用kafka运维或者开发人员会用到的,使用这些工具和脚本可以大大提高工作效率。

tools模块

tools模块是Kafka官方提供的命令行工具和测试工具的实现模块,提供了Kafka的命令行工具、运维脚本、诊断工具等,主要用于Kafka集群的管理、运维、性能测试、功能验证等,比如创建topic,管理ACL,测试生产者性能等,Kafka 在发行包的 bin 目录下,提供了大量以 kafka-xxx.sh 命名的脚本,这些脚本本质上就是通过调用 tools 模块来实现的功能。

shell模块

shell模块是Kafka官方实现的一个交互式命令行工具框架,用于以“类Unix Shell”的方式管理和操作Kafka的元数据、集群状态等。本质上就是一个Java实现的交互式命令行工具,根据输入的命令通过Kafka的API与Broker或元数据服务通信,实现元数据的浏览、查询、管理等功能。它提供了类似于文件系统shell(如bash、zsh)的交互体验,操作对象是Kafka的元数据结构,支持常见的shell命令(如ls、cd、pwd、cat、tree、find、help、exit等),但这些命令操作的是Kafka的元数据树,而不是文件系统。

generator模块

generator模块是Kafka源码中的自动化代码生成工具,主要用于根据协议、元数据、消息结构等描述文件,自动生成Kafka内部所需的Java类、协议实现、序列化/反序列化代码、JSON转换器等。比如根据kafka协议针对每种类型/版本的请求的字段生成对应的java类代码,它是开发和构建阶段的辅助工具,通常在Kafka源码编译、协议变更、自动化构建等场景下被调用,是Kafka开发和维护中提升效率的重要工具。

examples模块

examples模块为Kafka用户和开发者提供了丰富的示例代码,帮助大家快速上手Kafka的Producer、Consumer、Streams等API的使用方法。

jmh-benchmarks模块

jmh-benchmarks 模块是 Kafka 项目中的性能基准测试模块,基于 JMH(Java Microbenchmark Harness)框架实现。它用于对 Kafka 的关键组件、算法、数据结构等进行微基准性能测试,帮助开发者评估和优化系统的性能瓶颈。比如提供 Kafka 相关代码的微基准测试用例,评估不同实现、参数、配置下的性能表现。jmh-benchmarks 模块仅用于开发和性能调优阶段,不参与生产环境部署和主流程逻辑。

JMH(Java Microbenchmark Harness)是 OpenJDK 官方的 Java 微基准测试框架,专门用于准确测量 Java 代码的性能。它能有效避免JVM优化带来的测试偏差,支持多线程、参数化、基准分组等高级特性。

trogdor模块

trogdor 是 Kafka 官方自带的集群压力测试与故障注入工具模块。它的主要目标是为 Kafka 集群提供自动化的性能压测、稳定性测试和故障模拟能力,帮助开发者和运维人员在真实或准生产环境下评估 Kafka 的性能极限和容错能力。trogdor 采用“协调器-代理(Coordinator-Agent)”架构,协调器负责任务的全局调度和监控,代理分布在各个节点上,负责实际执行测试任务。任务类型和参数高度可配置,支持自定义扩展。

2.2.7 测试

这部分主要用于kafka代码测试相关

test-common模块

test-common模块的主要作用是为Kafka的各种测试用例提供通用的测试工具类、基类、mock实现、测试辅助方法等。避免在每个测试工程/目录中重复实现通用的测试逻辑,提高测试代码的复用性和维护性。

tests模块

tests严格来说不是一个模块,而是一个目录,主要用于存放Kafka项目的各种测试用例、测试工具、测试脚本(python脚本),测试数据和配置,比如提供Kafka集群的自动化部署、启动、关闭、清理等辅助脚本,测试数据生成、对比、校验等工具,各种测试所需的配置文件、数据文件、模拟环境等等。它是Kafka保证高质量、高可靠性的重要基础设施。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915294.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915294.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915294.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java内存图

java内存图java文件运行流程程序的内存空间认识虚拟机栈程序的执行流程认识堆java的类与对象的关系java文件运行流程 有这样的一份 java 文件 在该目录下的终端运行 javac Hello.java 命令,会生成 Hello.class 文件,内容如下: Hello.java 打…

vscode编辑Markdown文件

一.安装Markdown的插件 vscode的扩展,搜索Markdown Preview Enhanced的插件,并安装。 其他的常用插件,还包括: Markdown All in One :提供了许多有用的功能,如快捷键支持、自动预览、TOC(目录&…

【PTA数据结构 | C语言版】查找树中带有指定数据的结点

本专栏持续输出数据结构题目集,欢迎订阅。 文章目录题目代码题目 请编写程序,创建有 4 个结点的树,然后查找给定的 x。 输入格式: 输入首先在第一行给出 4 个正整数,依次对应树的根结点、根的第 1、2、3 个孩子结点的…

PostgreSQL常用命令与工具指南

文章目录PostgreSQL常用命令与工具指南简介1. 连接与基本操作连接数据库环境变量设置(避免密码输入)常用元命令2. 数据库与表管理数据库操作创建数据库删除数据库修改数据库属性表操作创建表修改表结构删除表索引管理创建索引删除索引3. 数据操作(CRUD)插…

SpringBoot项目部署至云服务器

目录 一、后端项目部署 1、修改配置文件 2、清理打包缓存,打jar包(两种方式二选一) 自动打包 手动打包 打包成功状态 3、将jar包导入宿主机上 jar包位置 jar包上传 jar包运行 浏览器测试 二、前端代码 docker搭建nginx的基本步骤 打…

Agent-S:重新定义下一代 AI 智能体开发框架

Agent-S:重新定义下一代 AI 智能体开发框架 —— 探索 simular-ai 的开源革命 引言 2025 年,AI 智能体(Agent)技术正从概念走向产业核心。从自动化工作流到复杂决策系统,开发者亟需更高效的工具链。在这一背景下&am…

保持视频二维码不变,如何更新视频内容,节省物料印刷成本

保持视频二维码不变,如何更新视频内容,节省物料印刷成本? 视频替换功能,是指在保持视频二维码不变、视频观看地址不变、视频调用代码不变的情况下替换视频内容,从而节省用户印刷物料的成本,满足用户更新视…

flutter项目调试问题小结

背景 目标是用android studio flutter 跑hello world 下载 android studio 我下载的是2024.3.2.15版本 最新版下载首页就能下:下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 历史版本可在归档列表下载:Android Studio…

明细列表,明细grid中的默认按钮失效,配置按钮失效

明细列表,明细grid中的默认按钮失效,配置按钮失效原因:采用通配的写法导致的默认按钮失效if(menuDetails){menuDetails.forEach((item) > {const { name, menu_detail_columns, menu_detail_buttons, save_url} item;this.set(${name}Gri…

Matplotlib 30分钟精通

📊 Matplotlib 30分钟精通计划(完整版含输出) ⏰ 时间分配 5分钟:Matplotlib基础概念和简单图表 10分钟:常用图表类型详解 10分钟:图表美化和定制 5分钟:综合实战练习 📚 第一部分:Matplotlib基础概念 (5分钟) 1. 什么是Matplotlib? import matplotlib.pyplot a…

7月19日 暴雨蓝色预警:全国多地迎强降雨,需防范次生灾害

中央气象台7月19日10时继续发布暴雨蓝色预警,预计未来24小时(19日14时至20日14时),我国多地将迎来大到暴雨,局地甚至出现大暴雨,并伴有短时强降水、雷暴大风等强对流天气,需加强防范。 强降雨覆盖范围广,多地需警惕极端降水 此次降雨影响范围广泛,涉及华北、华南、西…

Redis学习-05Redis基本数据结构

Redis 数据结构 String 字符串 基本命令表命令执行效果时间复杂度set key value [key value…]设置 key 的值是 valueO(k), k 是键个数get key获取 key 的值O(1)del key [key …]删除指定的 keyO(k), k 是键个数mset key value [key value …]批量设置指定的 key 和 valueO(k),…

开启modbus tcp模拟调试

1、新建modbus tcp服务器 ‌功能差异‌‌客户端功能‌: 生成并发送Modbus请求报文(如功能码03读取寄存器)。‌‌ 解析服务器响应数据,实现远程监控或控制。‌‌ ‌服务器端功能‌: 监听默认端口(如502&…

昇思+香橙派 AI 开发实践:DeepSeek 全流程指南(基于 openEuler)

一、 环境准备 1. 镜像烧录 镜像烧录可以在任何操作系统内执⾏,这⾥以在Windows系统为例,使用balenaEtcher⼯具,快速烧录镜像到Micro SD卡中。 本章节所需的软/硬件如下: 软件相关:balenaEtcher制卡⼯具、openEul…

AI生成邮件发送脚本(带附件/HTML排版)与定时爬取网站→邮件通知(价格监控原型)

想象一下:每天早晨咖啡还没喝完,你的邮箱就自动收到了心仪商品的最新价格;重要报告准时带着专业排版的附件发送到客户手中——这一切不需要你手动操作。本文将用不到100行代码带你实现这两个自动化神器! 一、为什么我们需要自动化…

【vLLM 学习】Encoder Decoder Multimodal

vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ *在线运行 vLLM 入门教程:零基础分步指南 源码 examples/offline_inf…

【MySQL笔记】视图

目录一、什么是视图?二、使用视图的优势三、视图的创建与使用四、不能更新视图的场景五、删除视图六、总结一、什么是视图? 视图(View)是一种虚拟表,不存储实际数据,而是通过执行预定义的查询动态生成数据…

【RK3576】【Android14】分区划分

获取更多相关的【RK3576】【Android14】驱动开发,可收藏系列博文,持续更新中: 【RK3576】Android 14 驱动开发实战指南

Datawhale 25年7月组队学习coze-ai-assistant Task1学习笔记:动手实践第一个AI Agent—英伦生活口语陪练精灵

Chap1 了解AI工作流 1.1什么是工作流 工作流 就像是一条流水线,把复杂的任务拆分成多个简单的步骤,每一步都有明确的目标和流程。1.2智能体和工作流的区别 智能体(AI Agent) **是什么 :**智能体是一个自动化的“助手”…

Webpack插件开发深度指南:从原理到实战

Webpack插件是前端工程化的核心引擎,本文将带你深入插件开发全流程,实现一个功能完整的资源清单插件,并揭示Tapable事件系统的核心原理。 一、Webpack插件机制解析 1.1 插件架构核心:Tapable事件系统 Webpack基于Tapable构建了…