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记录了最新的控制器纪元,排除旧的控制器的消息干扰,大部分分布式选举组件都有这个功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

github问题解决(持续更新中)

1、ssh: connect to host github.com port 22: Connection refused 从.ssh文件夹中新建文件名为config,内容为: Host github.com Hostname ssh.github.com Port 4432、解决 git 多用户提交切换问题 使用系统命令ssh创建rsa公私秘钥 C:\Users\fyp01&g…

使用Redis构建简易社交网站(1)-创建用户与动态界面

目的 本文目的:实现简易社交网站中创建新用户和创建新动态功能。(完整代码附在文章末尾) 相关知识 本文将教会你掌握:1.redis基本命令,2.python基本命令。 redis基本命令 hget:从哈希中获取指定域的值…

vitepress的使用

创建项目并启动项目 // 1.创建项目,直接在空项目下安装vitepress(npm/yarn等都可以,这个可以看官网,官网给了好几种安装方式) yarn add -D vitepress // 2.初始化配置项目(npm/官网也给了多种包管理工具的安装方式) npx vitepress init // 初始化命令执行完会遇到以下几个问题…

Python---函数递归---练习:猴子吃桃问题(本文以递归算法 解法为主)

相关链接:Python---函数递归---练习:斐波那契数列(本文以递归算法为主)-CSDN博客 案例:猴子吃桃问题 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。…

Web前端监控的方案

Web前端监控的方案 前端监控是一个非常重要的话题,对于业务的发展意义重大,就像遍布在城市各处的探头,实时监测整座城市的运行状况,保证系统的稳定、高效运行。 前端监控的意义 前端监控,对于业务和团队的重要性&am…

Kafka 的起源和背景

Apache Kafka 是一个分布式流处理平台,被广泛用于构建实时数据流应用程序和大数据处理系统。本文将深入探讨 Kafka 的起源、设计原则以及它在大数据领域中的重要作用。 大数据和实时数据处理背景 在大数据时代,处理海量数据和实时数据成为了一项关键挑…

C++学习之路(十七)C++ 用Qt5实现一个工具箱(增加托盘图标并且增加显示和退出菜单)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《为屏幕颜色提取功能增加一个点击复制的功能》功能。今天我们增加一个比较正式点的功能,就是增加托盘图标并且增加显示和退出菜单(越来越像回事了吧 😁 )。下面我们就来…

Python---函数递归---练习:使用递归求N的阶乘(如n=100)(本文以递归算法 解法为主)

相关链接:Python---函数递归---练习:斐波那契数列(本文以递归算法为主)-CSDN博客 Python---if选择判断结构、嵌套结构(if elif else)_python多重if嵌套-CSDN博客 案例:使用递归求N的阶乘&…

RabbitMQ架构是什么样的

publisher 生产者,发送消息的一方。 consumer 消费者,消费消息的一方。 queue 队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理。 exchange 交换机,负责消息路由,生产者发送的消息由交换…

ORA-00257: archiver error. Connect internal only, until freed……

今天给客户测 试问题,让客户把数据发过来了。解压缩后一看,他们还是用的oracle 815版本的(他们exp导出时,带了导出日志,从导出日志中看出来是oracle 815版本的),不过没有关系,低版本的exp是可以用高版本的i…

C语言扫雷小游戏

以下是一个简单的C语言扫雷小游戏的示例代码&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>#define BOARD_SIZE 10#define NUM_MINES 10int main() { int board[BOARD_SIZE][BOARD_SIZE]; int num_flags, num_clicks; int …

vmware虚拟机17 安装macos14过程及问题处理亲测

前期准备 1、可引导可虚拟机安装的macOS Sonoma 14 ISO镜像安装文件 我找到得地址&#xff0c;下载自行解决啦 2、VMware虚拟机应用软件 官网下载就好&#xff0c;搜个码搞定 3、解锁工具macOS Unlocker 开始安装&#xff1a; 1、打开VMware软件&#xff0c;新建一个系统…

Sakila数据库和World数据库

Sakila数据库和World数据库 安装MySQL8.2的时候多出两个样例数据库 Sakila数据库和World数据库 Sakila数据库是一个关于DVD租赁的样例数据库&#xff0c;用于展示MySQL的各种功能和特性。Sakila数据库中包含了多个表&#xff0c;包括电影、演员、客户、租赁记录等&#xff0c;可…

AR助推制造业智能转型:实时远程协作与可视化引领生产创新

制造商面临着多方面的变革&#xff0c;技术的兴起催生了工业物联网&#xff08;IIoT&#xff09;&#xff0c;改变了现代工厂的外貌、系统和流程。同时&#xff0c;全球竞争压力和不断变化的员工队伍要求采用新的员工培训方法&#xff0c;并重新审视工人在工厂中的角色。尽管如…

GPT实现开放式世界游戏实践【生化危机】

最近开始研究如何基于GPT构建一个游戏引擎&#xff0c;于是先从简单的文字游戏开始探索。 从最简单的选择机制、故事机制&#xff0c;完善成一个包括天气、事件、技能、属性、伙伴、建造系统的-生化危机版文字游戏-。 我唯一的体验是&#xff1a;AI游戏&#xff0c;大有可为! …

c++——取地址(引用)和取内容(解引用)操作

今天又做蒙了一道题&#xff0c;把思考和实验记录下来。 struct sk{ int a; float b;}data; int *p; 若要使p指向data中的a域&#xff0c;正确的赋值语句是 p&a; pdata.a; p&data.a; *pdata.a前两个可以很容易看出错误之处&#xff0c;a是结构体内的变量&#xff0c;需…

MyBatis增删改查和配置文件

MyBatis增删改查 MyBatis新增 新增用户 持久层接口添加方法 void add(User user);映射文件添加标签 <insert id"add" parameterType"com.mybatis.pojo.User">insert into user(username,sex,address) values(# {username},# {sex},# {address}) <…

(一)舒尔特表练习记

舒尔特表练习记 1 练习的开始 我们知道&#xff0c;一段时间中注意力的保持&#xff0c;对于学习效果的影响很大。我想应该不少朋友们有过和我相似的感觉&#xff0c;学着学着&#xff0c;就莫名开始容易走神&#xff1b;一行字看过去&#xff0c;发现自己脑子里什么也没有留…

C++实现ATM取款机

C实现ATM取款机 代码&#xff1a;https://mbd.pub/o/bread/ZZeZk5Zp 1.任务描述 要求&#xff1a;设计一个程序&#xff0c;当输入给定的卡号和密码&#xff08;初始卡号和密码为123456) 时&#xff0c;系统 能登录 ATM 取款机系统&#xff0c;用户可以按照以下规则进行: 查询…

JVM垃圾回收机制GC

一句话介绍GC&#xff1a; 自动释放不再使用的内存 一、判断对象是否能回收 思路一&#xff1a;引用计数 给这个对象里安排一个计数器&#xff0c; 每次有引用指向它&#xff0c; 就把计数器1&#xff0c; 每次引用被销毁&#xff0c;计数器-1&#xff0c;当计数器为0的时候…