当前位置: 首页 > news >正文

[消息队列 Kafka] Kafka 架构组件及其特性(一)

工作中的消息队列用的是Kafka,一直没有系统的了解,这边集中整理一下。

目录

Kafka主要组件有十个部分。

1.Broker(服务器)

2.Record(消息)

3.Producer(生产者)

4.Consumer(消费者)

5.Topic(主题)

6.Partition(分区)

7.Replica(副本机制)(和分区结合起来是Kafka实现高可用和负载均衡的原理)

8.Segment(段)

9.Consumer Group(消费者组)

10.Consumer Offset(偏移量)(Kafka,单分区消息顺序消费的原因)

Kafka的整体架构

Kafka特性

1)磁盘顺序I/O(速度不亚于内存I/O)

2)索引

3)批量处理和压缩传递(海量吞吐的基础)

4)零拷贝


Kafka作为消息队列(当然它不仅仅只有消息队列这一个应用场景。)

Kafka主要组件有十个部分。

1.Broker(服务器)

a)Broker就是Kafka的服务器,用于存储和管理消息,默认是9092端口

b)生产者和Broker建立连接,将消息发送到服务器上存储起来

c)消费者跟Broker建立连接,订阅和消费服务器上存储的消息。

2.Record(消息)

a)客户端传输的数据叫做消息,在Kafka中也叫Record.

b)Record在客户端是一个KV键值对(ProducerRecord, ConsumerRecord)

c)Record在服务端是一个KV键值对(RecordBatch(批量发送) 或 Record).

3.Producer(生产者)

发送消息的一方称为生产者,

Kafka为了提升消息发送速率,生产者默认采用批量发送的方式发送消息至Broker,

一条发送多少条由参数batch.size决定(默认16K)


4.Consumer(消费者)

a)订阅,接收消息的一方叫消费者

b)消费者获取消息有两种模式:Pull模式(拉)(消费者主动从消息队列中获取消息),Push模式(推)(Broker把消息推送给消费者)

Kafka采用的是Pull模式,因为Kafka是支持大数据的,如果采用Push模式的话,海量数据可能把下游消费端给打爆,所以Kafka采用Pull模式推送消息

c)Pull模式,消费者可以控制一次到底获取多少条消息(max.pull.records 默认是500)

5.Topic(主题)


a)topic(主题)一个逻辑概念,可以理解为一组消息的集合

b)生产者和消费者通过topic进行消息的写入和读取

c)生产者发送消息时候,若topic不存在,是否自动创建:auto.create.topics.enable(建议关闭)

6.Partition(分区)


a)分区(Partition)就是把一个topic分成几个不同的部分

b)一个topic在创建时候可以划分多个分区,若没有指定,默认分区数为1,可通过参数修改(num.partitions)

c)Kafka中修改分区规则:可加,不可减

7.Replica(副本机制)(和分区结合起来是Kafka实现高可用和负载均衡的原理


a)Replica(副本)是Partition(分区)的副本,每个分区可以有若干个副本(但是不能超过集群数量)

b)副本必须在不同的Broker上,副本包括了主从节点(Leader(图片中蓝色部分),Foller(图片中灰色部分))

c)服务端可以通过参数控制默认副本数(offsets.topic.repilication.factor)(一般不这样用,一般直接通过命令设置副本数)

生产者只会往leader节点发送消息,消费者也只会从leader节点读取消息,Kafka通过将各消息的leader节点放在不同的Broker(也就是服务器)上,实现了负载均衡,然后个分区follower节点实现了高可用

8.Segment(段)

Kafka的数据文件是写在.log文件里面的,另外一起还对生成对应的索引.index文件和对应的时间.timeIndex文件。

但是很容易的可以理解,如果一直往一个log文件里面追加数据,那么长时间使用之后log文件的的查找会随着数据量变大而变慢,所以在这种情况下就引入了Segement段的概念。

a)Segement(端)的目的是:建一个分区的数据划分、存储到不同的文件中

b)每个Segment至少由一个数据文件和2个索引文件构成,3个文件是成套出现的。

c)引入段的意义:

加快查询效率

删除数据时减少逐条IO

d)Segement大小控制:

按时间周期生成 log.roll.hours(默认一周)

按文件大小生产 log.segment.bytes(默认1G)

9.Consumer Group(消费者组)

​​​​​​​

由于生产者可能短时间内生产大量消息,为了提升消息的消费速率,就增加了消费者组的概念(group id)

a)使用消费者组,提升消费效率和吞吐量

b) 同一个Group中的消费者,不能消费相同的分区(group id相同,在一个组内)

10.Consumer Offset(偏移量)(Kafka,单分区消息顺序消费的原因)

Kakfa在单分区里面的消息是顺序存储的。

a)Offset(偏移量)的目的在于:记录消费者的消费位置

b)Kafka现行版本将Offset保存在服务器(__consumer_offsets_)主题中(0.9版本以前是在zooKeeper中)

Kafka的整体架构

上图所示:

集群中有三个Broker,有两个topic,都有三个副本,topic0有两个分区,分区1(图中左上角的Partition(0))的leader在Broker0中,分区2leader在Broker1中,topic1的分区leader在broker2中。

生产者往leader分区(蓝色部分)发送消息时候,leader节点会向follower节点同步备份消息(绿色线条部分)。然后每个消费者组对消息进行消费(红色箭头部分)(想通消费者组的消费者不能消费同一个分区的消息)

Kafka特性

1)磁盘顺序I/O(速度不亚于内存I/O)

Kafka采用的是磁盘顺序I/O

磁盘顺序I/O相对于随机I/O不同点在于:

随机I/O,数据存储在磁盘的位置是分散的,所以需要多次磁盘寻址来读取和写入数据。

但是顺序I/O只需要一次磁盘寻址。去除了重复寻址的过程。Kafka的记录是不断追加到本地磁盘的末尾的,所以是顺序I/O。

2)索引

Kafka在Broker端提供了offset索引和timeIndex(时间戳)索引,两种索引采用了稀疏索引的方案

3)批量处理和压缩传递(海量吞吐的基础)

在收发消息的时候批量处理。

压缩算法进行压缩后传递(gzip等)

4)零拷贝

传统的I/O拷贝如上图:

数据文件从磁盘到网卡,会经过四次从用户态到内核态切换。比较耗时

但是Kafka采用的是linux中的sendfile()函数,采用的是零拷贝的技术,使得读写有比较高的提升

对应的java源码中使用的是transferTo函数

以上就是Kafka整体架构,主要组件和对应的特性。后续还会记录几个主要组件的原理帮助理解。

相关文章:

[消息队列 Kafka] Kafka 架构组件及其特性(一)

工作中的消息队列用的是Kafka,一直没有系统的了解,这边集中整理一下。 目录 Kafka主要组件有十个部分。 1.Broker(服务器) 2.Record(消息) 3.Producer(生产者) 4.Consumer&…...

【Flutter 面试题】 JIT 与 AOT分别是什么?

【Flutter 面试题】 JIT 与 AOT分别是什么? 文章目录 写在前面口述回答写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2023博客之星TOP153。 👏🏻 正在学 Flutter 的同学,你好! 😊 Flutter 面试宝典(…...

QT获取最小化,最大化,关闭窗口事件

QT获取最小化,最大化,关闭窗口事件 主程序头文件: 实现: changeEvent,状态改变事件 closeEvent触发点击窗口关闭按钮事件 其代码它参考: /*重写该函数*/ void MainWindow::changeEvent(QEvent *event) {…...

Oracle作业调度器Job Scheduler

Oracle数据库调度器 (Oracle Database Scheduler) 在数据库管理系统中,数据库调度器负责调度和执行数据库中的存储过程、触发器、事件等。它可以确保这些操作在正确的时间和条件下得到执行,以满足业务需求。 1、授权用户权限 -- 创建目录对象 tmp_dir…...

Vue 组件之间的通信

在 Vue.js 中,组件是构建应用程序的基本单位。然而,当你的应用程序变得复杂时,组件之间的通信变得至关重要。本文将介绍几种 Vue 组件之间通信的方式,帮助你更好地管理和组织代码。 父子组件通信 父组件可以通过 props 向子组件传…...

Elementary OS 7.1简单桌面调整

Elementary OS的Pantheon桌面环境提供了一种非常独特和直观的用户体验。默认情况下,Pantheon桌面并没有提供传统的窗口最小化、最大化按钮。但是可以通过安装和使用特定的工具来调整和自定义这些设置。 可以通过以下步骤来启用窗口的最小化和最大化按钮&#xff1a…...

【C++ | 析构函数】类的析构函数详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-06-06 1…...

ceph radosgw 原有zone placement信息丢失数据恢复

概述 近期遇到一个故障环境,因为某些原因,导致集群原有zone、zonegroup等信息丢失(osd,pool等状态均健康)。原有桶和数据无法访问,经过一些列fix后修复, 记录过程 恢复realm和pool相关信息 重…...

​​​​【动手学深度学习】残差网络(ResNet)的研究详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 残差网络 🌍3.2 练习 🌊4. 研究体会 🌊1. 研究目的 了解残差网络(ResNet)的原理和架构;探究残…...

freertos初体验 - 在stm32上移植

1. 说明 freertos内核 非常精简,代码量也很少,官方也针对主流的编译器和内核准备好了移植文件,所以 freertos 的移植是非常简单的,很多工具(例如CubeMX)点点鼠标就可以生成一个 freertos 的工程&#xff0…...

ubuntu使用 .deb 文件安装VScode

使用 .deb 文件安装 下载 VSCode 的 .deb 文件: wget -q https://go.microsoft.com/fwlink/?LinkID760868 -O vscode.deb使用 dpkg 安装: sudo dpkg -i vscode.deb如果有依赖项问题,使用以下命令修复: sudo apt-get install -f...

9.1.1 简述目标检测领域中的单阶段模型和两阶段模型的性能差异及其原因

9.1目标检测 场景描述 目标检测(Object Detection)任务是计算机视觉中极为重要的基础问题,也是解决实例分割(Instance Segmentation)、场景理解(Scene Understanding)、目标跟踪(Ob…...

系统化自学Python的实用指南

目录 一、理解Python与设定目标 二、搭建学习环境与基础准备 三、入门学习阶段 四、中级进阶阶段 五、项目实践与持续深化 六、持续学习与拓展 一、理解Python与设定目标 Python概述:详细介绍Python的历史沿革、设计理念、主要特点(如易读、易维护…...

加密货币初创企业指南:如何寻找代币与市场的契合点

撰文:Mark Beylin,Boost VC 编译:Yangz,Techub News 原文来源:香港Web3媒体Techub News 在 Y Combinator 创始人 Paul Graham 《Be Good》一文中概述了初创企业如何找到产品与市场契合点的方法,即制造人…...

【十二】图解mybatis日志模块之设计模式

图解mybatis日志模块之设计模式 概述 最近经常在思考研发工程师初、中、高级工程师以及系统架构师各个级别的工程师有什么区别,随着年龄增加我们的技术级别也在提升,但是很多人到了高级别反而更加忧虑,因为it行业35岁年龄是个坎这是行业里的共…...

RainBond 制作应用并上架【以ElasticSearch为例】

文章目录 安装 ElasticSearch 集群第 1 步:添加组件第 2 步:查看组件第 3 步:访问组件制作 ElasticSearch 组件准备工作ElasticSearch 集群原理尝试 Helm 安装 ES 集群RainBond 制作 ES 思路源代码Dockerfiledocker-entrypoint.shelasticsearch.yml制作组件第 1 步:添加组件…...

JVM相关:Java内存区域

Java 虚拟机(JVM)在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 Java运行时数据区域是指Java虚拟机(JVM)在执行Java程序时,为了管理内存而划分的几个不同作用域。这些区域各自承担特定的任务&#xff0c…...

【C++】─篇文章带你熟练掌握 map 与 set 的使用

目录 一、关联式容器二、键值对三、pair3.1 pair的常用接口说明3.1.1 [无参构造函数](https://legacy.cplusplus.com/reference/utility/pair/pair/)3.1.2 [有参构造函数 / 拷贝构造函数](https://legacy.cplusplus.com/reference/utility/pair/pair/)3.1.3 [有参构造函数](htt…...

Mintegral数据洞察:全球中轻度游戏市场与创意更新频率

基于2024年3月大盘数据,汇量科技数据研究中心发现,超休闲品类仍是投流中轻度手游的中流砥柱。而投流力度较大的其他细分品类里,可以看到棋牌、模拟经营、非4X策略以及合成X游戏的身影,这些品类是近年来经常出现融合玩法的新兴赛道…...

贝锐蒲公英异地组网:降低建筑工地远程视频监控成本、简化运维

中联建设集团股份有限公司是一家建筑行业的施工单位,专注于建筑施工,业务涉及市政公用工程施工总承包、水利水电工程施工总承包、公路工程施工总承包、城市园林绿化专业承包等,在全国各地开展有多个建筑项目,并且项目时间周期可能…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...