图解Kafka架构学习笔记(一)

本文参考尚硅谷大数据技术之Kafka。

消息队列

在这里插入图片描述
(1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)
点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端**。这个模型的特点是发送到队列的消息被一个且只有一个接收者接收处理,即使有多个消息监听者也是如此**。
(2)发布/订阅模式(一对多,数据生产后,推送给所有订阅者)
发布订阅模型则是一个基于推送的消息传送模型。发布订阅模型可以有多种不同的订阅者,临时订阅者只在主动监听主题时才接收消息,而持久订阅者则监听主题的所有消息,即使当前订阅者不可用,处于离线状态。


为什么需要消息队列(消息队列的优点)

  1. 解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

  2. 冗余:消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

  3. 扩展性:因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。

  4. 灵活性 & 峰值处理能力:在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

  5. 可恢复性:系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

  6. 顺序保证在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。(例如,Kafka保证一个Partition内的消息的有序性)

  7. 缓冲:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

  8. 异步通信:**很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。**想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

什么是Kafka

  1. Apache Kafka 是一个开源消息系统,由Scala写成。它是由Apache软件基金会开发的一个开源消息系统项目,主要用于缓存数据以支持流式计算。

  2. 发展历程:Kafka最初是由LinkedIn公司开发,并于2011年初开源。2012年10月,Kafka从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一、高通量、低延迟的平台。

  3. 核心概念

    • Kafka是一个分布式消息队列
    • 在Kafka中,消息按Topic进行分类
    • 发送消息的角色称为Producer。
    • 接收消息的角色称为Consumer。
    • Kafka集群由多个Kafka实例组成,每个实例称为Broker。
  4. 系统依赖

    • Kafka集群和Consumer都依赖于Zookeeper集群来保存一些元信息(meta信息),以保证系统的可用性。

Kafka架构

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

  1. Broker:一台Kafka服务器就是一个Broker。一个集群由多个Broker组成。一个Broker可以容纳多个Topic。

  2. Producer:消息生产者,即向Kafka Broker发送消息的客户端。

  3. Consumer:消息消费者,即从Kafka Broker取消息的客户端。

  4. Consumer Group (CG):消费者组,由多个Consumer组成。消费者组是一组消费者实例,它们共同消费一个或多个topic,以达到高吞吐量和负载平衡。Kafka保证一个分区内的消息只被消费者组中的一个消费者读取,这意味着在一个消费者组内,每个分区的数据只被一个消费者处理。如果一个消费者组中有多个消费者实例,Kafka会自动平衡每个消费者负责的分区,以优化数据处理速度。消费者组允许多个消费者实例协作处理数据,这样可以在处理大量数据时,提供更高的并发度和数据吞吐量。当新的消费者加入组或者现有的消费者退出组时,分区所有权会在组内消费者之间重新平衡。

  5. Topic:可以理解为一个队列,生产者和消费者面向的都是一个Topic。

  6. Partition:为了实现扩展性,一个非常大的Topic可以分布到多个Broker(即服务器)上,一个Topic可以分为多个Partition,每个Partition储存不同的数据,每个Partition是一个有序的队列。

  7. Replica:副本,为保证集群中的某个节点发生故障时,该节点上的Partition数据不丢失,且Kafka仍然能够继续工作,Kafka提供了副本机制,一个Topic的每个分区都有若干个副本,一个Leader和若干个Follower。

  8. Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是Leader。

  9. Follower:每个分区多个副本中的“从”,实时从Leader中同步数据,保持和Leader数据的同步。Leader发生故障时,某个Follower会成为新的Leader。

Kafka生产过程分析

写入方式

producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)

分区(Partition)

消息发送时都被发送到一个topic,其本质就是一个目录,而topic是由一些Partition Logs(分区日志)组成,其组织结构如下图所示:
在这里插入图片描述
在这里插入图片描述
Kafka中的消息存储和处理是以分区(Partition)为基础的。每个分区中的消息都是有序的,并且每条消息都被赋予了一个唯一的offset值。以下是关于分区的原因和原则:

1. 分区的原因

  • 扩展性:通过增加Partition,可以方便地在集群中进行扩展。每个Partition可以调整以适应它所在的机器,而一个Topic则可以由多个Partition组成,这样,整个集群就能够适应任意大小的数据。
  • 并发性:由于读写操作可以以Partition为单位进行,因此可以提高并发性,从而提升整体系统的吞吐量。

2. 分区的原则

  • 指定Partition:如果在生产消息时指定了Partition,则消息将直接发送到该Partition。
  • 指定Key未指定Partition如果未指定Partition但指定了Key,那么将通过对Key的值进行哈希(hash)处理来决定消息应该发送到哪个Partition
  • 未指定Partition和Key:如果既未指定Partition也未指定Key,那么将采用轮询方式(round-robin)来选择一个Partition。

通过这种方式,Kafka能够有效地处理大量数据,同时保持高效率和数据一致性。

副本(Replication)

在没有副本的情况下,一旦负责存储特定分区数据的服务器(Broker)发生故障,那么该分区的数据将无法访问,这不仅影响消费者(Consumer)获取数据,也阻止生产者(Producer)继续写入数据。引入副本之后,每个分区都会有多个副本,大大提高了数据的安全性和系统的稳定性。

  • Leader和Follower:为了管理这些副本,Kafka为每个分区的副本集合选出一个领导者(Leader),其余的副本成为跟随者(Follower)。
  • 数据交互:生产者(Producer)和消费者(Consumer)仅与领导者(Leader)进行交互,这包括数据的写入和读取。
  • 数据复制:跟随者(Follower)负责从领导者(Leader)那里复制数据。即使在领导者发生故障时,由于存在跟随者的副本,Kafka仍能通过选举新的领导者来继续运行,而不会影响数据的可用性和服务的连续性。

通过引入副本机制,Kafka确保了即使在部分服务器宕机的情况下,数据和服务仍然是可用的,从而提高了整体系统的鲁棒性。

写入流程

在Apache Kafka中,副本机制的引入旨在提高数据可靠性和系统可用性。以下详细介绍了使用副本机制时,消息发布和确认的标准过程:

  1. 确定Leader

    • 生产者(Producer)首先需要从Zookeeper的 /brokers/.../state 节点查询到该分区(Partition)的领导者(Leader)。
  2. 发送消息

    • 生产者将消息发送到这个确定的领导者(Leader)。
  3. 消息写入

    • 领导者(Leader)将收到的消息写入其本地日志(Log)。
  4. 消息复制

    • 跟随者(Followers)从领导者(Leader)那里拉取(Pull)消息,并将这些消息写入它们各自的本地日志。完成写入后,跟随者会向领导者发送确认(ACK)。
  5. 确认消息

    • 一旦领导者(Leader)从所有处于同步副本集(ISR, In-Sync Replicas)中的副本收到确认(ACK),它就会提升高水位标记(High Watermark),即最后提交的偏移量(Offset),然后向生产者发送确认(ACK)。

通过这一流程,Kafka确保了数据的可靠性和系统的高可用性,即使在部分节点宕机的情况下,服务也能正常运行。
在这里插入图片描述

Broker 保存消息

存储方式

物理上把topic分成一个或多个patition(对应 server.properties 中的num.partitions=3配置),每个patition物理上对应一个文件夹(该文件夹存储该patition的所有消息和索引文件),如下:

[atguigu@hadoop102 logs]$ ll
drwxrwxr-x. 2 atguigu atguigu  4096 86 14:37 first-0
drwxrwxr-x. 2 atguigu atguigu  4096 86 14:35 first-1
drwxrwxr-x. 2 atguigu atguigu  4096 86 14:37 first-2
[atguigu@hadoop102 logs]$ cd first-0
[atguigu@hadoop102 first-0]$ ll
-rw-rw-r--. 1 atguigu atguigu 10485760 86 14:33 00000000000000000000.index
-rw-rw-r--. 1 atguigu atguigu      219 86 15:07 00000000000000000000.log
-rw-rw-r--. 1 atguigu atguigu 10485756 86 14:33 00000000000000000000.timeindex
-rw-rw-r--. 1 atguigu atguigu        8 86 14:37 leader-epoch-checkpoint

存储策略

无论消息是否被消费,kafka都会保留所有消息。有两种策略可以删除旧数据:
1)基于时间:log.retention.hours=168
2)基于大小:log.retention.bytes=1073741824
需要注意的是,因为Kafka读取特定消息的时间复杂度为O(1),即与文件大小无关,所以这里删除过期文件与提高 Kafka 性能无关。

Zookeeper存储结构

在这里插入图片描述
注意:producer不在zk中注册,消费者在zk中注册

Kafka消费过程分析

kafka提供了两套consumer API:高级Consumer API和低级Consumer API。

高级API

优点

  1. 简化编程:使用高级API可以简化编程,不需要开发者自行管理offset,系统通过Zookeeper自动管理。
  2. 自动管理:不需要手动管理分区、副本等细节,系统会自动进行管理。
  3. 容错性:如果消费者断线,它会自动根据上一次记录在Zookeeper中的offset继续获取数据(默认设置每分钟更新一次Zookeeper中存储的offset)。
  4. 分组隔离:可以使用group来区分对同一个topic的不同程序访问,保证不同的group记录不同的offset,这样不同的程序读取同一个topic时不会因为offset互相影响。

缺点

  1. 限制性:不能自行控制offset,这对于需要进行特殊处理的场景可能是一个限制。
  2. 细节控制不能细化控制如分区、副本、Zookeeper等详细操作

低级API

1)低级 API 优点

  • 能够让开发者自己控制offset,想从哪里读取就从哪里读取。 自行控制连接分区,对分区自定义进行负载均衡
  • 对zookeeper的依赖性降低(如:offset不一定非要靠zk存储,自行存储offset即可,比如存在文件或者内存中)

2)低级API缺点

  • 太过复杂,需要自行控制offset,连接哪个分区,找到分区leader 等。

消费者组

Kafka的消费者是按照消费者组(Consumer Group)的方式组织的,这意味着一个或多个消费者可以组成一个组来共同消费一个topic

工作方式

  • 分区所有权每个分区在同一时间只能由一个消费者组内的消费者读取,确保消息的有序处理。但不同消费者组可以同时消费同一个分区,实现消息的多订阅
  • 组内消费:在一个消费者组内,消费者平均分配或根据策略分配topic的分区。例如,如果一个topic有三个分区,消费者组中有三个消费者,通常每个消费者会消费一个分区。
  • 负载均衡:如果某个消费者失败,消费者组内的其他成员会自动重新分配失败消费者所负责的分区,这样保证了消费的连续性和高可用性。

水平扩展

  • 通过增加消费者数量,消费者组可以水平扩展,以提高消息处理的速度和效率。
  • 消费者组的水平扩展使得Kafka能够支持处理大量消息,满足高吞吐需求。

自动故障转移

  • 如果消费者组中的某个消费者出现故障,剩余的消费者会自动接管故障消费者的分区,继续消费消息,这个过程称为自动负载均衡。
  • 这种机制确保了即使在某些消费者失败的情况下,消息仍然可以被有效和及时地处理。

通过上述机制,Kafka的消费者组提供了一个强大、灵活和高效的方式来处理和消费大规模的消息流。

在这里插入图片描述

消费方式

consumer采用pull(拉)模式从broker中读取数据

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

对于Kafka而言,pull模式更合适,它可简化broker的设计,consumer可自主控制消费消息的速率,同时consumer可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义。

pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直等待数据到达。为了避免这种情况,我们在我们的拉请求中有参数,允许消费者请求在等待数据到达的“长轮询”中进行阻塞(并且可选地等待到给定的字节数,以确保大的传输大小)。


参考

https://www.cnblogs.com/datadance/p/16292991.html
https://mantou.plus/2021/03/05/kafka%E6%9E%B6%E6%9E%84/
https://blog.csdn.net/philip502/article/details/118966065

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

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

相关文章

【JS】html字符转义

需求 将html转为字符串将html字符串转义&#xff0c;比如<div>转为<div> 码 /*** html标签字符转义* param {Stirng} str 要转换的html字符* returns String 返回转义的html字符串*/ const elToStr str > str.replaceAll(<, <).replaceAll(>, >)…

sadtalker-api/

———— 下载sadtalker工程文件&#xff0c;包括844个模型 。。。。。。。。。。。。。。。。 配置环境&#xff1a; pip源&#xff0c;设置&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple anaconda prompt, 进入命令行 how在 …

8-图像缩放

其实&#xff0c;就是开辟一个zoomwidth&#xff0c;zoomheight的内存&#xff0c;再分别赋值即可。 void CDib::Scale(float xZoom, float yZoom) { //指向原图像指针 LPBYTE p_data GetData(); //指向原像素的指针 LPBYTE lpSrc; //指向缩放图像对应像素的指针 LPBYTE lpDs…

【Flink SQL】Flink SQL 基础概念(四):SQL 的时间属性

《Flink SQL 基础概念》系列&#xff0c;共包含以下 5 篇文章&#xff1a; Flink SQL 基础概念&#xff08;一&#xff09;&#xff1a;SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念&#xff08;二&#xff09;&#xff1a;数据类型Flink SQL 基础概念&am…

算法练习:前缀和

目录 1. 一维前缀和2. 二维前缀和3. 寻找数组中心下标4. 除自身以外数组的乘积5. !和为k的子数字6. !和可被k整除的子数组7. !连续数组8. 矩阵区域和 1. 一维前缀和 题目信息&#xff1a; 题目链接&#xff1a; 一维前缀和思路&#xff1a;求前缀和数组&#xff0c;sum dp[r] …

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包,第六:trans_nullmodel class

近几十年来&#xff0c;系统发育分析和零模型的整合通过增加系统发育维度&#xff0c;更有力地促进了生态位和中性影响对群落聚集的推断。trans_nullmodel类提供了一个封装&#xff0c;包括系统发育信号、beta平均成对系统发育距离(betaMPD)、beta平均最近分类单元距离(betaMNT…

解决后端传给前端的日期问题

解决方式&#xff1a; 1). 方式一 在属性上加上注解&#xff0c;对日期进行格式化 但这种方式&#xff0c;需要在每个时间属性上都要加上该注解&#xff0c;使用较麻烦&#xff0c;不能全局处理。 2). 方式二&#xff08;推荐 ) 在WebMvcConfiguration中扩展SpringMVC的消息转…

专业120+总400+北京理工大学826信号处理导论考研经验北理工电子信息与通信工程,真题,大纲,参考书。

**今年专业课826信号处理导论&#xff08;信号系统和数字信号处理&#xff09;120&#xff0c;总分400&#xff0c;应群里同学需要&#xff0c;自己总结一下去年的复习经历&#xff0c;希望对大家复习有帮助。**专业课&#xff1a; 北京理工大学专业826是两门合一&#xff0c;…

Flutter开发进阶之使用工具效率开发

Flutter开发进阶之使用工具效率开发 软件开发团队使用Flutter开发的原因通常是因为Flutter开发性能高、效率高、兼容性好、可拓展性高&#xff0c;作为软件PM来说主要考虑的是范围管理、进度管理、成本管理、资源管理、质量管理、风险管理和沟通管理等&#xff0c;可以看到Flu…

微信小程序调用百度智能云API(菜品识别)

一、注册后生成应用列表创建应用 二、找到当前所需使用的api菜品识别文档 三、点链接看实例代码 这里需要使用到如下几个参数&#xff08;如下&#xff09;&#xff0c;其他的参数可以不管 client_id &#xff1a; 就是创建应用后的API Keyclient_secret&#xff1a; 就是创建…

Vue mqtt 附在线mqtt客户端地址 + 完整示例

mqtt&#xff1a;轻量级物联网消息推送协议。 目录 一、介绍 1、官方文档 1&#xff09;npm网 2) 中文网 MQTT中文网_MQTT 物联网接入平台-MQTT.CN 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 mqtt 四、完整示例 tips 一、介…

正则表达式与re模块

目录 正则表达式 简介 语法&#xff1a; 常用元字符&#xff1a; 量词: 贪婪匹配和惰性匹配&#xff1a; re模块 简介&#xff1a; 常用的几个模块&#xff1a; 1.findall 2.search 3.finditer 4.compile 案例展示&#xff1a; 需求&#xff1a; 思路分析&#…

《论文阅读》E-CORE:情感相关性增强的移情对话生成 EMNLP 2023

《论文阅读》E-CORE:情感相关性增强的移情对话生成 EMNLP 2023 前言摘要模型架构图构建边的构建和初始化节点的初始化图更新情感相关性加强解码损失函数总结前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来…

IDEA 多个git仓库项目放一个窗口

1、多个项目先通过新建module或者CtrlAltShiftS 添加module引入 2、重点是右下角有时候git 分支视图只有一个module的Repositories。这时候需要去设置把多个git仓库添加到同一个窗口才能方便提交代码。 3、如果Directory Mappings已经有相关项目配置&#xff0c;但是灰色的&…

浅谈JPA框架

JPA 前言概述ORM 映射元数据JPQLJPA API附Spring Data JPA 前言 了解 JPA 框架对后续使用 Spring Boot 是有很大帮助的&#xff0c;下面简单介绍 JPA 框架的基础知识。 概述 JPA&#xff08; Java 对象持久化 API &#xff0c;Java Persistence API &#xff09;&#xff0c…

物联网数据驾驶舱

在信息化时代&#xff0c;数据已经成为驱动企业发展的核心动力。特别是在物联网领域&#xff0c;海量数据的实时采集、分析和监控&#xff0c;对于企业的运营决策和业务优化具有至关重要的作用。HiWoo Cloud作为领先的物联网云平台&#xff0c;其数据监控功能以“物联网数据驾驶…

npm包、全局数据共享、分包

使用 npm 包 小程序对 npm 的支持与限制 目前&#xff0c;小程序中已经支持使用 npm 安装第三方包&#xff0c;从而来提高小程序的开发效率。但是&#xff0c;在小程序中使用npm 包有如下 3 个限制&#xff1a; ① 不支持依赖于 Node.js 内置库的包 ② 不支持依赖于浏览器内置…

C++——string

一学习string的原因 1.从个人理解角度上&#xff1a; 在刚开始学习之前&#xff0c;我只知道学习完string在以后的刷题中能提高做题效率&#xff0c;在对字符串的处理string库中也许有对应的接口去实现需求&#xff0c;不用自己去写函数的实现。 但在学string中改变了之前的…

安卓安装Magisk面具以及激活EdXposed

模拟器&#xff1a;雷电模拟器 安卓版本: Android9 文中工具下载链接合集&#xff1a;https://pan.baidu.com/s/1c1X3XFlO2WZhqWx0oE11bA?pwdr08s 前提准备 模拟器需要开启system可写入和root权限 一、安装Magisk 1. 安装magisk 将magisk安装包拖入模拟器 点击&#xff1a…

UnityShader(十六)凹凸映射

前言&#xff1a; 纹理的一种常见应用就是凹凸映射&#xff08;bump mapping&#xff09;。凹凸映射目的就是用一张纹理图来修改模型表面的法线&#xff0c;让模型看起来更加细节&#xff0c;这种方法不会改变模型原本的顶点位置&#xff08;也就是不会修改模型的形状&#xf…