Kafka学习(2)——理解Kafka

【Kafka】入门Kafka的学习建议 本文希望帮助想了解Kafka的朋友们进行入门或者深入地学习,也算是作者学习Kafka之后的小感悟。 阅读详情

1 框架

Kafka是一种分布式的发布/订阅消息系统。主要设计目标如下:

  • 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。
  • 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。
  • 支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。
  • 同时支持离线数据处理和实时数据处理。
  • Scale out:支持在线水平扩展。

这里写图片描述

从上图可以看到kafka的核心组件是Broker、Producer和consumer。

  • Producer。向Kafka服务器发送/生产消息的组件。
  • Consumer。从Kafka服务器取出/消费消息的组件。
  • Broker。kafka服务器。接收Producer和Consumer的请求,并把Message持久化到本地磁盘。Cluster会选举出一个Broker来担任Controller,负责处理Partition的Leader选举,协调Partition迁移等工作。

以上组件在分布式环境下均可以是多个,支持故障转移。同时ZK仅和broker和consumer相关。值得注意的是broker的设计是无状态的,消费的状态信息依靠消费者自己维护,通过一个offset偏移量。

Broker内部维护着Topic和Partition。

这里写图片描述

  • Topic。是划分Message的逻辑概念,一个Topic可以分布在多个Broker上。
  • Partition。每个Topic都至少有1个Partition,是消息最终存储的位置。Partition内消息按照序号顺序存储。
  • Offset。消息在当前Partition中的编号,编号顺序不跨Partition。

Producer发送消息到达Broker后,消息按照Topic提交到Partition上。在Partition中,消息是按序号顺序存储的。Consumer从Partition上顺序读取消息,并将从Partition上读取的最后一条消息的offset存储到zookeeper。一个partition只能有一个consumer进行消费。因此,Partition是Kafka中横向扩展和一切并行化的基础。

这里写图片描述

这里写图片描述

  • Consumer Group。每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。同一Topic的同一个消费组维护同一份offset。

这里写图片描述

2 设计

kafka设计的目标是:

  • 高吞吐量,支持大容量事件流;
  • 高抗压,支持离线系统周期性的数据压力;
  • 低延迟;
  • 动态分布式分区;
  • 容错;

2.1 消息交付保证

消息交付是否可靠,有以下几种保证:

  • At least once。至少一次。消息绝不会丢失,但有可能重新发送。(request.required.acks=1或-1)。Kafka的默认保证。
  • At most once。最多一次。消息可能丢失,但永远不会重发。通过设置Producer异步提交可以实现。(request.required.acks=0)。
  • Exactly once。传递一次且仅一次。要求利用外部存储系统配合Kafka的offset来保证。

2.2 高吞吐量

高吞吐量依赖于OS文件系统的页缓存、sendfile技术和线性读写磁盘:

  • PageCache

依赖OS的页缓存能大量减少IO,高效利用内存来作为缓存。当上层有写操作时,操作系统只是将数据写入OS的PageCache,同时标记Page属性为Dirty。当读操作发生时,先从PageCache中查找,如果发生缺页才进行磁盘调度,最终返回需要的数据。实际上PageCache是把尽可能多的空闲内存都当做了磁盘缓存来使用。同时如果有其他进程申请内存,回收PageCache的代价又很小。

  • zero-copy

传统网络IO,OS 从硬盘把数据读到内核区的PageCache,用户进程把数据从内核区Copy到用户区。然后用户进程再把数据写入到Socket,数据流入内核区的Socket Buffer上。OS 再把数据从Buffer中Copy到网卡的Buffer上,这样完成一次发送。整个过程共经历两次Context Switch,四次System Call。

同一份数据在内核Buffer与用户Buffer之间重复拷贝,效率低下。其中2、3两步没有必要,完全可以直接在内核区完成数据拷贝。这也正是Sendfile所解决的问题,经过Sendfile优化后,整个I/O过程就变成了下面这个样子。

这里写图片描述
这里写图片描述

  • 磁盘顺序写

磁盘线性读写要比随机读写快很多。顺序IO不仅可以利用RAID技术带来很高的吞吐量,同时可以基于文件的读和追加来构建持久化队列,利用队列来提供常量时间O(1)时间复杂度的put和get。

  • 消息压缩

Producer支持End-to-End的压缩。数据在本地压缩后放到网络上传输,在Broker一般不解压(除非指定要Deep-Iteration),直至消息被Consume之后在客户端解压。

当然用户也可以选择自己在应用层上做压缩和解压的工作(毕竟Kafka目前支持的压缩算法有限,只有GZIP和Snappy),不过这样可能造成效率的意外降低!

Kafka的End-to-End压缩与MessageSet配合在一起工作效果最佳,上面的做法直接割裂了两者间联系。至于道理其实很简单,压缩算法中一条基本的原理“重复的数据量越多,压缩比越高”。大多数情况下输入数据量大一些会取得更好的压缩比。

2.3 producer

producer只向leader partition发送消息。通过load balance,将消息发送到不同的partition。

producer采用push模式,任性地不需要考虑consumer是否能处理。如果要保证低延迟,就需要consumer快速处理,一般是在consumer端进行缓存。

为了保证低延迟,producer一次只发送一条数据,比较浪费,可采用批量发送。

2.4 consumer

kafka采用pull模式。push模式和pull模式相比,push模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息,可使消费速率最大化。

基于pull模式的另一个优点是,它有助于积极的批处理的数据发送到消费者。基于push模式必须选择要么立即发送请求或者积累更多的数据,稍后发送它,无论消费者是否能立刻处理它,如果是低延迟,这将导致短时间只发送一条消息,不用缓存,这是实在是一种浪费,基于pull的设计解决这个问题,消费者总是pull在日志的当前位置之后pull所有可用的消息(或配置一些大size),所以消费者可设置消费多大的量,也不会引入不必要的等待时间。

2.5 高可用

kafka引入replication和leader机制来实现高可用。

将Topic的Partition的副本分配到集群中的其他Broker上,允许故障时请求自动转到副本上。分配Replica的算法如下:

(1) 将n个Broker和待分配的Partition排序
(2) 第i个Partition分配到第i%n个Broker
(3) 第i个Partition的第j个Replica分配到第(i + j) %n个Broker

Leader负责数据读写,Follower只向Leader顺序Fetch数据(N条通路)。Leader会跟踪与其保持同步的Replica列表,该列表称为ISR(即in-sync Replica)。Consumer读消息也是从Leader读取,只有被commit过的消息才会暴露给Consumer。

当Producer发布消息到某个Partition时:

(1) 先通过ZooKeeper找到该Partition的Leader,然后无论该Topic的Replication Factor为多少(也即该Partition有多少个Replica),Producer只将该消息发送到该Partition的Leader。Leader会将该消息写入其本地Log。
(2) 每个Follower都从Leader pull数据。这种方式上,Follower存储的数据顺序与Leader保持一致。Follower在收到该消息并写入其Log后,向Leader发送ACK。
(3) 一旦Leader收到了ISR中的所有Replica的ACK,该消息就被认为已经commit了,Leader将增加HW并且向Producer发送ACK。
(4) 为了提高性能,每个Follower在接收到数据后就立马向Leader发送ACK,而非等到数据写入Log中。因此,对于已经commit的消息,Kafka只能保证它被存于多个Replica的内存中,而不能保证它们被持久化到磁盘中,也就不能完全保证异常发生后该条消息一定能被Consumer消费。

当leader宕机时,通过leader election从replica中选举leader。只有ISR里的成员才有被选为Leader的可能。如果所有Replica都不工作,那么kafka将选择第一个“活”过来的Replica(不一定是ISR中的)作为Leader。

所有Partition的Leader选举Leader选举都由controller决定。在所有broker中选出一个controller,controller会将Leader的改变直接通过RPC的方式(比ZooKeeper Queue的方式更高效)通知需为为此作为响应的Broker。同时controller也负责增删Topic以及Replica的重新分配。

broker failover过程如下:

这里写图片描述

STM32F407VET6与CH395Q串口通信实战:从零搭建以太网客户端(附完整代码) 本文详细介绍了基于STM32F407VET6微控制器与南京沁恒微CH395Q以太网芯片,通过串口通信从零搭建TCP客户端应用的完整实战过程。内容涵盖硬件连接、驱动层设计、基于FreeRTOS的任务实现以及核心调试技巧,并提供了完整的代码示例,帮助嵌入式开发者快速实现设备联网功能。 阅读详情

相关推荐

零基础学会制作 基于STM32/51单片机的智能血压表设计/血压表/血压计

本系统是以单片机为主控,传感器模快、显示模块、人机交互、无线传输等组成的智能血压表设计。传感器用于测量血压和脉搏,主控电路板用于处理数据和控制设备,显示屏则用于显示测量结果。通过软件设计,完成测量数据的处理,其中血压和脉搏的测量、数据的分析和处理等。

weixin_55654459的博客 2473

Kafka源码分析(五) - Server端 - 基于时间轮的延时组件

Kafka源码分析,侧重于时间轮延时组件

村口老张头的专栏 1989

地质工程师必备:Dips软件从数据导入到主结构面分析的完整流程解析

本文详细解析了地质工程师使用Dips软件进行主结构面分析的完整流程。从数据准备与导入、结构面分组与扇形区划分,到主结构面计算与工程解读,系统阐述了如何将野外节理数据转化为控制岩体稳定性的关键信息。重点介绍了利用等值线图识别优势组、计算统计主值及其置信椭圆,并强调了地质判断与工程应用结合的重要性。

table的专栏 340

Kafka史上最详细原理总结(一)

Kafka史上最详细原理总结 一、概念理解(1)产生背景(2)Kafka的特性(3)Kafka场景应用(4)Kafka一些重要设计思想二、消息队列通信的模式(1)点对点模式(2)发布订阅模式三、Kafka的架构原理(1)基础架构与名词解释(2)工作流程分析(1)发送数据(2)保存数据(3)消费数据 一、概念理解 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大

徐小慧_Blog的博客 1万+

SAP固定资产原值与净值取值逻辑全解析:从数据表到ABAP实战

在企业资源计划(ERP)系统中,固定资产的价值管理是财务会计的核心模块,其关键在于准确核算资产原值与净值。从技术原理上看,这涉及对资产全生命周期业务(如购置、折旧、转移、报废)的财务建模,以及底层数据表(如ANLC、ANEP)的精准关联与计算。掌握这一逻辑的技术价值在于,能够确保财务报表数据的准确性,满足合规性要求,并为管理决策提供可靠依据。在SAP ECC或S/4HANA系统的应用场景中,ABAP开发者与财务顾问常需通过编写报表程序,从复杂的数据结构中提取资产价值信息。本文聚焦于SAP资产会计模块,深入剖

weixin_30984001的博客 389

vue项目基于WebRTC实现一对一音视频通话

vue项目基于WebRTC实现一对一音视频通话。完整代码gitee地址: https://gitee.com/wade-nian/wdn-webrtc.git。

qq_920189602的博客 6646

Kafka深度解析

背景介绍Kafka简介 [size=16.7999992370605px]  Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,并保证即使对TB级以上数据也能保证常数时间的访问性能 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输 支持Kafka Server间的消息分区,

雲的博客 2530

DRM驱动代码分析:展频 跳频

DRM驱动代码分析:展频 跳频

yuuu_cheer的博客 2669

Kafka日志段读写解析

引子 之所以写这篇文章是因为之前面试时候被面试官问到(倒)了,面试官说:“你说你对Kafka比较熟?看过源码? 那说说kafka日志段如何读写的吧?” 我心里默默的说了句 “擦…我说看过一点点源码,不是亿点点。早知道不提这句了!”,那怎么办呢,只能回家等通知了啊。 但是为了以后找回场子,咱也不能坐以待毙,日拱一卒从一点点到亿点点。今天我们就来看看源码层面来Kafka日志段的是如何读写的。 Kafka的存储结构 总所周知,Kafka的Topic可以有多个分区,分区其实就是最小的读取和存储结构,即Consum

yes 1234

物理小白也能懂的PINN指南:用Python给神经网络注入‘物理常识‘

本文为物理小白提供了一份通俗易懂的PINN入门指南。通过生活化类比和Python实战,详细讲解了如何将物理定律作为约束注入神经网络,使其具备“物理常识”,从而在数据稀缺时也能做出符合规律的预测。文章以热传导方程为例,手把手教你从零构建物理信息神经网络。

open4的博客 347

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 982

Kafka Streams实战项目推荐

Kafka Streams实战项目推荐 项目介绍 欢迎来到《Kafka Streams实战》源代码项目!本项目包含了书中所有示例代码的实现,旨在帮助读者深入理解Kafka Streams的强大功能和应用场景。无论你是Kafka Streams的初学者还是有经验的开发者,本项目都能为你提供丰富的实战经验和代码参考。 项目技术分析 本项目主要基于Kafka Streams构建,Kafka Stream...

gitblog_00416的博客 682

用 ABAP LSMW 的 Standard Batch / Direct Input 稳准快迁移物料主数据:从 MM01 录制到 RMDATIND 直入的落地指南

本文详细介绍了SAP数据迁移中LSMW工具的使用方法,重点分析了物料主数据迁移的两种主要路径:Batch Input Recording和Standard Batch/Direct Input。前者通过录制事务操作实现快速起步,后者通过调用预置接口程序实现稳定高效的批量处理。文章深入解析了Standard Direct Input的具体实施步骤,包括对象属性设置、源结构定义、字段映射规则等关键环节,并特别强调了迁移前的准备工作(如编号策略、视图策略等)对项目成功的重要性。通过对比两种方法的优缺点,为不同业务

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 150

别找了,Kafka视频、书、面试题全给你准备好了~~

这是彭文华的第105篇原创Kafka到底有多重要?这么说吧,大数据领域任何一个架构,都缺不了它。作为一个超级消息中间件,它可以用在所有高并发、高吞吐的任何数据场景中。你要是不懂Kafka都...

weixin_52346300的博客 278

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

springboot集成kafka及所有功能方法

spingboot集成kafka官方文档

qq_39035267的博客 357

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

字节跳动面试官:Kafka日志段如何读写的?

近些年来,大数据技术蓬勃发展,各种围绕大数据处理的平台技术越来越多,相关的开源工具和实践资料也越来越丰富。对于一个大型系统而言,我们通常需要围绕消息队列来构建整个系统的逻辑,Kafka便是这一主流的消息系统之一。 我们知道,当下流行的MQ(Message Queue)非常多,不过很多一线大厂企业在技术选型上还是选择使用Kafka。与其他主流M...

墨鱼菜鸡 185

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

火狐三步手动装猫抓插件:从 .xpi 到视频嗅探的完整教程

猫抓(cat-catch)视频资源嗅探扩展目前没有上架火狐官方附加组件商店,用户需要从项目官方仓库手动安装 .xpi 包。本文带你走完"挑对安装包 → 三步安装 → 验证嗅探"的完整链路,全程不需要任何编程知识。从下载文件到真正能拿到 mp4、m3u8 资源链接,整套流程不超过 5 分钟。 ## 安装前,先确认两个前提 **什么是 .xpi**:火狐扩展的专用安装包格式,相当于 Chrome

gitblog_00434的博客 530

简历里最好要有这个东西!

最近看到了个重磅消息,即将发布的 Kafka 2.8 版本会移除 ZooKeeper,这可是 Kafka 在架构上的重大升级。让一向“重量级”的 Kafka 从此变得简单了起来,轻量级的单...

a934079371的博客 148

kafka-manager启动方式

我是使用下面这种方式启动kafka-manager nohup /opt/kafka-manager-2.0.0.0/bin/kafka-manager -Dconfig.file=/opt/kafka-manager-2.0.0.0/conf/application.conf -Dhttp.port=80 & 老大说不行,这种方式不好,让我用下面这种规范的方式 nohup /opt/kafka-manager-2.0.0.0/bin/kafka-manager -Dconfig.file=.

想练武,就得下功夫 1197

AI如何帮你高效准备Kafka面试题?

最近在准备Kafka相关的面试,发现知识点又多又杂,传统刷题方式效率太低。于是尝试用AI工具搭建了一个智能问答系统,效果出乎意料。分享一下我的实践过程,或许对你也有帮助。建议正在求职的朋友试试这个方法,用AI把枯燥的备考变成交互式学习体验。毕竟比起死记硬背,理解原理并能清晰表达才是通过技术面试的关键。特别处理了"Exactly-Once语义"等易混淆概念,要求AI对比说明与至少两种实现方案。- 直接在线编码不用配环境,遇到依赖问题随时通过终端解决。系统推荐的"高频易错TOP5"确实都是实际面试常考点。

OnyxPanther23的博客 408

值得学习!阿里P8架构师“墙裂,四面阿里Java开发岗

原本是抱着了解原理进而优化性能的想法来读的,却发现书中的内容都是讲源码,作者对源码的注释超级详细,非常适合开发者,但不适合使用者,给个五星好评是因为不想因为我这种菜鸡而埋没了高质量内容。书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。通俗易懂,图文并茂,用了很多图和示例讲解kafka的架构,从宏观入手,再讲到细节,比较好,值得推荐。另外别人的代码写的很好看,即便是过程式语言程序也吊打我写的面向对象语言程序。

m0_61331573的博客 370

GLM-5.2-w4a8 部署:昇腾多卡环境下跑通首次推理

GLM-5.2-w4a8 部署没有想象中复杂。它是智谱 GLM-5.2 的昇腾量化版,MoE 架构、78 层,采用 W4A8 混合精度量化,面向 NPU 推理优化。这篇文章按"环境 → 权重 → 服务"三步走,跑通首次对话大约 30 分钟,前提是机器上已有可用的昇腾 NPU。读完你能独立完成这套部署,也知道卡住时该去哪查。 ## 先看最终效果 跑通之后,你会得到一个 OpenAI 兼容接口,直

gitblog_01109的博客 779

Jupyter Notebook

[![Documentation Status](https://readthedocs.org/projects/<project>/badge/?version=latest)](https://<project>.readthedocs.io/en/latest/?badge=latest) ``` 要点如下: - 徽章本质是一张图片链接,随文档构建状态动态变化; - 将徽章紧跟在标题之

gitblog_01166的博客 489

DPT-2:面向企业级PDF理解的Agentic文档解析架构

PDF解析长期面临语义断层、布局失焦与责任真空三大技术瓶颈,传统OCR+规则引擎难以应对金融、法律、医疗等场景中扫描件混排、手写批注、电子签章遮挡等复杂需求。基于多Agent协同的文档理解范式正成为新一代解决方案的核心路径,其通过任务解耦、模块化验证与可追溯推理,显著提升结构化提取准确率与合规可信度。Agentic Document Extraction(ADE)强调系统具备主动拆解、跨模块调度与逻辑自检能力,而非端到端黑箱输出;结合Layout/Text/Table/Semantic四大专业化Agent,

weixin_33816821的博客 386

学习 Apache Kafka

学习 Apache Kafka 是一个很好的选择,尤其是在实时数据流处理和大数据领域。:Kafka 是用 Java/Scala 写的,了解 Java 能帮助你更好地理解内部原理(但入门使用不需要深入 Java)。:用 Kafka + ELK(Elasticsearch, Logstash, Kibana)收集应用日志。:企业级 Kafka 生态(如 Schema Registry、KSQL)。:管理 Kafka 集群元数据(新版本已逐步移除依赖)。:替换传统 MQ(如 RabbitMQ),解耦微服务。

u011091936的博客 1174

Kafka学习总结、Kafka与RabbitMQ的区别

初始Kafka Kafka是一个分布式的发布-订阅消息系统,能够支撑海量数据的数据传递。在离线和实时的消 息处理业务系统中,Kafka都有广泛的应用。Kafka将消息持久化到磁盘中,并对消息创建了备份保证了 数据的安全。Kafka在保证了较高的处理速度的同时,又能保证数据处理的低延迟和数据的零丢失。 特性 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个主题可...

tc979907461的博客 2万+
上一篇: Kafka学习(1)——kafka文档阅读笔记
下一篇: Kafka学习(3)——测试
白水不开
博客等级 码龄18年 91粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值