kafka教程

Kafka 中,Producer采用push模型,而Consumer采用pull模型。

Topic

Topic(主题)是消息的逻辑分类或通道。它是Kafka中用于组织和存储消息的基本单元。一个Topic可以被看作是一个消息发布的地方,生产者将消息发布到一个特定的Topic,而消费者则订阅一个或多个Topic以接收消息。

Consumer group

Consumer Group(消费者组): 为了扩展消费者并实现并行处理,多个消费者可以组成一个消费者组。每个分区只能由消费者组内的一个消费者处理,这样可以确保消息在每个分区内的有序处理。

每个消费者组都有一个组id!同一个消费组者的消费者可以消费同一topic下不同分区的数据,但是不会组内多个消费者消费同一分区的数据。
在这里插入图片描述
在实际的应用中,建议消费者组的consumer的数量与partition的数量一致

Partition

每个topic可以有多个分区,每个分区中的消息是有序的。
生产者将消息发布到topic时,Kafka会根据一定的策略将消息分配到不同的分区。
消费者可以订阅整个topic,也可以选择订阅topic的特定partition。
每个topic可以划分为一个或多个partition,分区是Kafka中的基本存储单元。
分区允许水平扩展,每个分区可以独立地分布在不同的机器上,提高了Kafka的伸缩性和性能。

那么当Producer将消息发送给broker,

分区的原因

  • 提高吞吐量: 分区允许Kafka集群并行处理消息。每个分区都是一个独立的有序队列,多个分区可以同时进行读写操作,使得整个系统能够更有效地处理大量的消息。这种并行性是Kafka实现高吞吐量的关键。

  • 实现水平扩展: 通过将消息分布在多个分区上,Kafka可以轻松地在集群中添加更多的Broker来实现水平扩展。每个Broker只需要负责一部分分区,从而有效地分担了负载。这种扩展性使得Kafka能够适应不断增长的数据量和流量。

  • 容错性: 每个分区的数据都可以有多个副本(Replica)在集群的不同Broker上存储。如果某个Broker或分区发生故障,其他副本依然可用。这种冗余机制提高了系统的容错性,确保了数据的可用性和持久性。

  • 有序性: 分区内的消息是有序的,而分区间的消息不做有序保证。这使得Kafka在保持消息的有序性的同时,可以在不同的分区上实现并行处理,使系统更加灵活。

  • 提供灵活的消息处理模型: 分区允许消费者以消费者组的形式协同处理消息。每个分区只能被同一个消费者

Parition的副本replice

为了提高可靠性和容错性,每个分区可以有多个副本(replica)。这些副本分布在不同的Broker上,确保即使其中一个Broker失效,仍然有其他副本可用。

在这里插入图片描述

Broker

Broker是一个独立的Kafka服务器实例,负责处理消息的生产和消费。

  • 存储: Broker存储了消息的持久化副本,以确保消息的持久性。每个Topic的分区被分布在不同的Broker上,以实现分布式存储和水平扩展。

  • Leader和Follower: 对于每个Topic的分区,一个Broker被选举为Leader,其余的为Follower。Leader负责处理读写请求,而Follower则同步Leader的数据,以提供容错和冗余。

  • 消息的生产和消费: 生产者将消息发送到Topic,而消费者从Topic中消费消息。Broker协调这两个过程,确保消息被正确地传递给订阅了相应Topic的消费者。

  • Broker负责存储和管理所有Topic的Partition数据,并协调Partition之间的数据同步和复制。

Producer

将消息发送给broker的过程:

  1. 选择 Topic: 生产者选择一个或多个目标 Topic。

  2. 选择分区: 如果生产者选择将消息发送到特定的分区,它可以指定分区,否则,Kafka 会使用一种策略(例如轮询或哈希)来决定将消息发送到哪个分区。

  3. 构造消息: 生产者构造要发送的消息,这可以是文本、二进制数据等。

  4. 发送消息: 生产者将消息发送给 Kafka 集群中的 Broker。生产者需要知道 Broker 的地址(通常至少提供一个 Broker 的地址),然后将消息发送给指定的 Topic 和分区。

Producer选择发送的分区过程

  1. partition在写入的时候可以指定需要写入的partition,如果有指定,则写入对应的partition。
  2. 如果没有指定partition,但是设置了数据的key,则会根据key的值hash出一个partition。
  3. 如果既没指定partition,又没有设置key,则会轮询选出一个partition。

Kafka将数据顺序存储在磁盘上

Kafka既将数据写入磁盘,也在内存中进行一些操作。Kafka的设计目标之一是提供持久性和高吞吐量。因此,它会将消息写入磁盘以确保数据的持久性,这使得即使在Broker重启后,数据仍然可用。

具体来说,Kafka使用了一种称为写入日志(write-ahead log)的机制。当消息被生产者发布到一个Topic时,Kafka首先将消息追加到该Topic的日志文件中。这些日志文件通常位于磁盘上。写入日志的方式使得消息的添加成为原子操作,并且消息按顺序写入。

同时,Kafka还利用内存来提高性能。在Broker内,Kafka会维护一个称为Page Cache的内存区域,用于缓存最近使用的数据块。这使得在读取数据时,可以在内存中快速获取,提高读取性能。

日志段

Partition在服务器上的表现形式就是一个一个的文件夹存储在磁盘上,每个partition的文件夹下面会有多组segment文件,每个segment文件中又包含.index文件、.log文件、.timeindex文件三个文件。

每个日志段包含三个主要文件:

.log 文件: 这个文件是实际存储消息的地方。消息以追加的方式写入这个文件,并且按顺序存储。这种追加写入的方式使得写入操作是高效的,同时也有助于提高读取性能。

.index 文件: 这个文件是索引文件,用于快速定位消息。它包含消息的物理偏移(offset)和消息的逻辑偏移(相对于分区的偏移)之间的映射。索引文件的存在使得 Kafka 能够更有效地执行消息的检索操作,而不必扫描整个日志文件。

.timeindex 文件: 这个文件是时间索引文件,在某些版本的 Kafka 中引入。它提供了消息时间戳和物理偏移之间的映射,以支持按时间范围检索消息。

每个分区由多个这样的日志段组成。当一个日志段达到一定的大小或者时间限制时,Kafka会创建一个新的日志段。这种机制有助于管理磁盘空间,同时也有利于日志的压缩和维护。

查找消息的时候是怎么利用segment+offset配合查找的呢?假如现在需要查找一个offset为368801的message是什么样的过程呢?我们先看看下面的图:

在这里插入图片描述

1、 先找到offset的368801message所在的segment文件(利用二分法查找),这里找到的就是在第二个segment文件。
  2、 打开找到的segment中的.index文件(也就是368796.index文件,该文件起始偏移量为368796+1,我们要查找的offset为368801的message在该index内的偏移量为368796+5=368801,所以这里要查找的相对offset为5)。由于该文件采用的是稀疏索引的方式存储着相对offset及对应message物理偏移量的关系,所以直接找相对offset为5的索引找不到,这里同样利用二分法查找相对offset小于或者等于指定的相对offset的索引条目中最大的那个相对offset,所以找到的是相对offset为4的这个索引。
  3、 根据找到的相对offset为4的索引确定message存储的物理偏移位置为256。打开数据文件,从位置为256的那个地方开始顺序扫描直到找到offset为368801的那条Message。
  
这套机制是建立在offset为有序的基础上,利用segment+有序offset+稀疏索引+二分查找+顺序查找等多种手段来高效的查找数据!

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

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

相关文章

机器学习9-随机森林

随机森林(Random Forest)是一种集成学习方法,用于改善单一决策树的性能,通过在数据集上构建多个决策树并组合它们的预测结果。它属于一种被称为“集成学习”或“集成学习器”的机器学习范畴。 以下是随机森林的主要特点和原理&…

IT行业含金量高的证书-软考

软考全称计算机技术与软件专业技术资格(水平)考试,软考既是职业资格考试,又是职称资格考试。2021年12月2号发布新版的国家职业资格目录,软考是在计算机技术领域中的唯一的国家职业资格。 一、好处 软考是一个神奇又特…

【数据结构】14 队列(带头结点的链式存储和顺序存储实现)

定义 队列是一个有序线性表,但是队列的插入、删除操作是分别在线性表的两个不同端点进行的。 设一个队列 Q ( a 1 , a 2 , . . . , a n ) Q (a_1, a_2,...,a_n) Q(a1​,a2​,...,an​),那么 a 1 a_1 a1​被称为队头元素, a n a_n an​为队…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息修改实现

锋哥原创的PyQt6图书管理系统视频教程: PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

从互联网的公开信息中,找到属于你的赚钱思路

一、教程描述 人们在互联网上的每一次搜索、每一次关注、每一次点击、每一次点赞、每一次评论、每一次付费,都生成了大量的数据和信息,暴露着人们的真实想法、欲望、恐惧和需求。这些数据和信息,就是我们身边的一座“金矿”,而大…

1【算法】——最大子数组问题(maximum subarray)

一.问题描述 假如我们有一个数组,数组中的元素有正数和负数,如何在数组中找到一段连续的子数组,使得子数组各个元素之和最大。 二.问题分析 分治法求解: 初始状态: low0;highA.length-1;mid&am…

最新的 Ivanti SSRF 零日漏洞正在被大规模利用

Bleeping Computer 网站消息,安全研究员发现 Ivanti Connect Secure 和 Ivanti Policy Secure 服务器端请求伪造 (SSRF) 漏洞(CVE-2024-21893 )正在被多个威胁攻击者大规模利用。 2024 年 1 月 31 日,Ivanti 首次就网关 SAML 组件…

万维网的文档

目录 1 万维网的文档 动态万维网文档 CGI CGI 网关程序 活动万维网文档 用 Java 语言创建活动文档 1 万维网的文档 分为: 静态万维网文档。内容不会改变。简单。(html、xml、css) 动态万维网文档。文档的内容由应用程序动态创建。 活动万维网文档。由浏览器端…

SpringBoot3整合Knife4j

前置&#xff1a; 官网&#xff1a;快速开始 | Knife4j gitee&#xff1a;swagger-bootstrap-ui-demo: knife4j 以及swagger-bootstrap-ui 集成框架示例项目 - Gitee.com 1.依赖引入&#xff1a; ps&#xff1a;json处理需要引入相关包 <dependency><groupId>c…

基于语义解析的知识图谱问答系统

目录 前言1 背景介绍2 语义解析的核心技术2.1 自然语言处理&#xff08;NLP&#xff09;2.2 语义表示学习2.3 实体关系抽取 3 语义解析的基本步骤3.1 短语检测3.2 资源映射3.3 语义组合3.4 逻辑表达式生成 4 处理与知识图谱无关的问句4.1 Bridging技术4.2 确定谓词4.3 Paraphra…

【新书推荐】7.4节 寄存器间接和相对寻址方式

本节内容&#xff1a;当指令操作数为内存操作数&#xff0c;且内存操作数的地址使用指针寄存器表示时&#xff0c;称为寄存器间接寻址方式。 ■寄存器间接寻址方式&#xff1a;在地址表达式中&#xff0c;只能使用BX、SI、DI、BP四个指针寄存器用来寻址。 7.4.1 寄存器间接寻…

猫头虎分享已解决Bug || API限制超额(API Rate Limiting):RateLimitExceeded, APILimitReached

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

mysql入门到精通006-基础篇-多表查询

1、多表关系介绍 1.1 概念 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求和业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在各种联系&#xff0c;基本上分为3种&#xf…

LeetCode.144. 二叉树的前序遍历

题目 144. 二叉树的前序遍历 分析 这道题目是比较基础的题目&#xff0c;我们首先要知道二叉树的前序遍历是什么&#xff1f; 就是【根 左 右】 的顺序&#xff0c;然后利用递归的思想&#xff0c;就可以得到这道题的答案&#xff0c;任何的递归都可以采用 栈 的结构来实现…

Microsoft Word 清除格式

Microsoft Word 清除格式 References 选择文本&#xff0c;用快捷键 Ctrl Shift N&#xff0c;可以快速清除格式。 选择文本&#xff0c;清除格式。 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

leetcode(矩阵)74. 搜索二维矩阵(C++详细解释)DAY7

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中…

Confluence CVE-2023-22527利用工具

介绍 Confluence CVE 2021&#xff0c;2022&#xff0c;2023 利用工具&#xff0c;支持命令执行&#xff0c;哥斯拉&#xff0c;冰蝎 内存马注入 支持 Confluence 版本&#xff1a;CVE-2021-26084&#xff0c;CVE-2022-26134&#xff0c;CVE_2023_22515&#xff0c;CVE-2023-2…

计算机网络——06分组延时、丢失和吞吐量

分组延时、丢失和吞吐量 分组丢失和延时是怎样发生的 在路由器缓冲区的分组队列 分组到达链路的速率超过了链路输出的能力分组等待排到队头、被传输 延时原因&#xff1a; 当当前链路有别的分组进行传输&#xff0c;分组没有到达队首&#xff0c;就会进行排队&#xff0c;从…

【MySQL进阶之路】生产案例:大量数据刷盘导致的数据库性能抖动问题优化

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

【Docker】Docker Container(容器)

文章目录 一、什么是容器&#xff1f;二、为什么需要容器&#xff1f;三、容器的生命周期容器OOM容器异常退出容器暂停 四、容器命令详解docker createdocker logsdocker attachdocker execdocker startdocker stopdocker restartdocker killdocker topdocker statsdocker cont…