MQ - KAFKA 基础篇

##1、KAFKA的核心组件/API
Producer API,它允许应用程序向一个或多个 topics 上发送消息记录

Consumer API,允许应用程序订阅一个或多个 topics 并处理为其生成的记录流

Streams API,它允许应用程序作为流处理器,从一个或多个主题中消费输入流并为其生成输出流,有效的将输入流转换为输出流。

Connector API,它允许构建和运行将 Kafka 主题连接到现有应用程序或数据系统的可用生产者和消费者。例如,关系数据库的连接器可能会捕获对表的所有更改
如下是KAFKA API图

在这里插入图片描述
##2、KAFKA的一些概念
我们从几个图来了解KAFKA的相关概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1、broker/物理概念:一个kafka服务器实例就是一个broker,多个kafka instance构成kafka cluster。broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。
2.2、topic/逻辑概念:在 kafka 中,使用一个类别属性来划分消息的所属类,划分消息的这个类称为 topic。在 kafka 中,可以无数个topic。
2.3、partion/物理概念:默认一个topic有一个分区(partition),自己可设置多个分区(分区分散存储在服务器不同节点上),partition在磁盘上就体现为一个目录。一个分区就是一个 提交日志。消息以追加的形式写入分区,先后以顺序的方式读取。
2.4、segment/物理概念:一个partition当中存在多个segment文件段,每个 segment 文件的大小相等且每个segment分为两部分,.log文件和.index文件,其中.index文件是索引文件,主要用于快速查询.log文件当中数据的偏移量位置
2.5、producer/物理概念:生产消息并通过zookeeper集群得知broker地址将消息push到broker中
2.6、consumer/物理概念:生产消息并通过zookeeper集群得知broker地址将消息从broker中pull到
2.7、zookeeper cluster/物理概念:相当于注册中心,含有broker信息,producer信息,consumer信息
2.8、consumer group/逻辑概念:由多个consumer组成共同消费broker/topic中的消息,消费者在消费消息时需要提供一个group id。注意的是同组消费者是处于竞争关系,即消息只能被同组中的某个消费者消费
2.9、controller/逻辑概念:控制器,在 Kafka 集群中会有一个或多个 broker,其中有一个 broker 会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。
2.10、ConsumerCoordinator与GroupCoordinator:新版本消费者为了降低对zk的依赖,避免羊群效应和脑裂问题,服务端引入了组协调器,消费者客户端引入了消费者协调器负责与服务端的组协调器进行交互。最重要的职责就是负责执行消费者再均衡的操作,包括分区分配的工作也是在再均衡期间完成的。

##3、对于上面kafka概念补充说明
3.1、topic补充说明:
3.1.1:首先它是一个逻辑上的东西,它有多个或一个分区组成,并且当有多个分区且多个broker实例时,一个topic的消息以分区的形式可以存在在不同的broker上。如下图partition0+partition1+partition2=topic,且partition0、partition1、partition2可以自由地分布在不同broker中
在这里插入图片描述
3.1.2:topic的Partition数量在创建topic时配置。
3.1.3:Partition数量决定了每个Consumer group中并发消费者的最大数量。如下图有两个broker,且topic被分成P0,P1,P2,P3四个分区,一个组中最大的并发消费数量为group B中的四个。
在这里插入图片描述
3.1.4:Partition中写入的offset
kafka当中的partition的offset任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset是一个long类型数字,它唯一标识了一条消息,消费者通过(offset,partition,topic)跟踪记录。结合3.3看就能理解

3.2、Partition副本补充说明:
3.2.1:一个broker下不存在某个partition的副本,副本只能存在在其他broker中,如下图:
在这里插入图片描述
3.2.2:副本分为leader副本和follower副本。
leader副本,代表分区本身,生产者的push和消费者pull的时候都只能通过leader推送和获取.凡事都可能例外,在最新版本中存在配置可消费非leader副本(与跨中心镜像容灾相关,日常使用不到)。
follower副本,leader的跟班,负责同步leader的消息,是leader的备份,防止broker故障时丢失消息.对用户来说,不用关心,kafka内部维护,并在leader崩溃时自动选举新的leader。
isr副本集合:跟随leader最快的副本,在leader故障时,可配置优先从isr中选举leader或仅从isr中选举leader. isr是为了提高kafka的吞吐量,当kafka收到消息时,不用等待所有副本回复确认,这是可用性和一致性的权衡.isr在高版本的kafka中有配置的最大等待同步时间确定,低版本中还要再加一个最大延迟的条数.总之是个动态维护的副本子集。

3.3、Segment补充说明
一个partition当中由多个segment文件组成,每个segment文件,包含两部分,一个是.log文件,另外一个是.index文件,其中.log文件包含了我们发送的数据存储,.index文件,记录的是我们.log文件的数据索引值,以便于我们加快数据的查询速度。下图是.index文件和.log文件对应关系:
3.3.1:.index文件3,497代表:数据文件中的第三个message,它的偏移地址为497;.log文件Message 368772表示:在全局partiton中是第368772个message
3.3.2:.index文件采取稀疏索引存储方式,它减少索引文件大小,通过mmap可以直接内存操作,稀疏索引为数据文件的每个对应message设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间
在这里插入图片描述

3.4、生产者、消费者、消费者组关系补充说明:
3.4.1:一个consumer group对kafka集群来讲,是逻辑上的一个consumer,各消费一部分数据
3.4.2:一个topic的 partion数 >= 一个consumer group的consumer数,一般建议保持相等,当分区数大于消费者数时,默认分配方式采用range,既partion数/consumer,余数分给前面的几个consumer。consumer group的设置,可灵活实现发布订阅方式(groupId相同)和点对点方式(groupId不同)
3.4.2:生产者是线程安全的,生产者实例数和线程数无关,达到期望的生产速率即可。消费者是线程不安全的,一个线程对应一个消费者实例。生产者消费者均是针对leader而言,其他非leader副本对客户端是不可见的
在这里插入图片描述
3.5:controller补充说明:
3.5.1:当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。
3.5.2:当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息。
3.5.3:当使用kafka-topics.sh脚本为某个topic增加分区数量时,同样还是由控制器负责分区的重新分配。
3.5.4:Kafka中的控制器选举工作依赖于ZooKeeper,成功竞选为控制器的broker会在ZooKeeper中创建/controller这个临时(EPHEMERAL)节点。另外配合/controller_epoch节点来确保控制器的唯一性,通过zk的特性保证同一时刻仅有一个控制器且zk记录了最新的控制器纪元,排除旧的控制器的消息干扰,大部分分布式选举组件都有这个功能。

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

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

相关文章

【springboot】启动失败 Failed to start bean ‘webServerStartStop‘

lsof -i:xxx 发现端口被占用 kill掉该进程

代码随想录算法训练营第五十三天【动态规划part14】 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 求解思路 动规五部曲 1.确定dp数组及其下标含义: dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序…

OpenWrt作为旁路由(网关)配置

目录 背景前提条件环境操作步骤物理层连接设置与主路由同一网段禁用IPv6取消LAN接口桥接防火墙配置 背景 本文简介如何配置OpenWrt,使其作为旁路由(网关)运行。 旁路由大概有以下这几种工作方式: 主路由开DHCP,网关未…

一文彻底弄懂动态规划【DP】

动态规划是一种重要的算法,它能解决很多看似复杂的问题,关键在于找到问题的子问题结构,并根据子问题的解决方式来解决原问题。首先要了解的是动态规划的基本思想: 动态规划的基本思想是:将一个复杂的问题分解为一系列…

深层神经网络(第四周)

这里省略了深层神经网络的前向传播和反向传播,内容和之前相似,不做过多描述。若今后需要,可以再补习。 一、为什么使用深层表示 解决问题时其实并不需要很大的神经网络,但是得有深度,得有比较多的隐藏层。这是为什么…

字符串转换整数

字符串转换整数 描述 : 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格检查下一个字符&am…

select选择框里填充图片,下拉选项带图片

遇到一个需求&#xff0c;选择下拉框选取图标&#xff0c;填充到框里 1、效果展示 2、代码 <el-form-item label"工种图标" class"Form_icon Form_label"><el-select ref"select" :value"formLabelAlign.icon" placeholder&…

Python第三方库版本管理(管理虚拟环境)

序言 最近使用python发现会有使用不同项目时需要的三方包依赖版本不同&#xff0c;如果各个项目相互切换&#xff0c;那么会经常需要更新版本。比如numpy当前版本时1.26.2&#xff0c;需要它小于版本1.21&#xff0c;有没有像Java一样通过Maven依赖管理中的版本控制去管理这些…

Redis--12--Redis分布式锁的实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis分布式锁最简单的实现如何避免死锁&#xff1f;锁被别人释放怎么办&#xff1f;锁过期时间不好评估怎么办&#xff1f;--看门狗分布式锁加入看门狗 redissonRe…

什么是跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;通常称为XSS&#xff09;&#xff0c;是一种典型的Web程序漏洞利用攻击&#xff0c;在线论坛、博客、留言板等共享…

数据结构和算法-线索二叉树中的线索化和在线索二叉树中找前驱后继

线索二叉树的概念 找到某个节点得按照遍历得到的序列开始遍历才能遍历全部节点&#xff0c;非常繁琐 中序线索二叉树 线索二叉树的存储结构 先序线索二叉树 后序线索二叉树 三种线索二叉树的对比 即对应前驱后后继判断标准不同 小结 二叉树的线索化 用土办法找中序前驱 当…

Prefix-Tuning 论文概述

Prefix-Tuning 论文概述 前缀调优&#xff1a;优化生成的连续提示前言摘要论文十问实验数据集模型实验结论摘要任务泛化性能 前缀调优&#xff1a;优化生成的连续提示 前言 大规模预训练语言模型(PLM)在下游自然语言生成任务中广泛采用fine-tuning的方法进行adaptation。但是f…

android studio安装SDK时无法勾选

这两天帮助学妹安装android studio安装SDK时无法勾选&#xff0c;记录一下最终解决办法。头大。 核心 360 问题 网上所有方法都尝试了包括挂梯子&#xff0c;改hosts&#xff0c;盘符权限等等。 最终解决下载360 使用这两个&#xff0c;DNS注意要用8.8.8.8的 成功解决

超硬核解析Mybatis动态代理原理!只有接口没实现也能跑?

文章目录 前言Mybatis dao层两种实现方式的对比原始Dao开发原始Dao开发的弊端 基于Mapper动态代理的开发方式 Mybatis动态代理实现方式的原理解析动态代理调用链路解析先给出链路调用结果1、调用方法的开始&#xff1a;session.getMapper2、DeaultSqlSession的getMapper3、Conf…

Selenium自动化测试:通过cookie绕过验证码的操作

验证码的处理 对于web应用&#xff0c;很多地方比如登录、发帖都需要输入验证码&#xff0c;类型也多种多样&#xff1b;登录/核心操作过程中&#xff0c;系统会产生随机的验证码图片&#xff0c;进行验证才能进行后续操作 ​解决验证码的方法如下&#xff1a; 1、开发做个万…

西瓜书-主要符号表

主要符号表 LaTeX符号说明How to read letter?\mathit{x}标量\boldsymbol{x}向量\mathrm{x}变量集\mathbf{A}矩阵\mathbf{I}单位阵\mathcal{X}样本空间或状态空间calligraphic X\mathcal{D}概率分布Ɗ calligraphic D\mathit{H}数据样本&#xff08;数据集)\mathcal{H}假设空…

基于OpenCV的手势1~5识别系统(源码&环境部署)

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着计算机视觉技术的快速发展&#xff0c;手势识别系统在人机交互、虚拟现实、智能监控等领域得到了广泛应用。手势识别系统可以通过分析人体的手势…

LTO编译器优化介绍以及开启方法

文章目录 LTO介绍LTO 开启方法 LTO介绍 LTO&#xff08;Link Time Optimization&#xff0c;链接时优化&#xff09;是一种在链接阶段进行优化的技术。传统的编译过程中&#xff0c;编译器仅能对单个编译单元进行优化。LTO 允许编译器看到跨编译单元的代码&#xff0c;从而进行…

jquery 判断是手机端还是电脑端

判断为手机端&#xff1a; var sUserAgent navigator.userAgent.toLowerCase(); var bIsIpad sUserAgent.match(/ipad/i) "ipad"; var bIsIphoneOs sUserAgent.match(/iphone os/i) "iphone os"; var bIsMidp sUserAgent.match(/midp/i) "mid…

【开源】基于Vue和SpringBoot的快递管理系统

项目编号&#xff1a; S 007 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S007&#xff0c;文末获取源码。} 项目编号&#xff1a;S007&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快…