01、kafka知识点综合

kafka是一个优秀大吞吐消息队列,下面我就从实用的角度来讲讲kafka中,“kafka为何有大吞吐的机制”,“数据不丢失问题”,“精准一次消费问题”

01、kafka的架构组织和运行原理

kafka集群各个节点的名称叫broker,因为kafka是一个消息队列,所以对应着有producer和consumer。在数据组织层面来说,kafka是通过topic来区分同一类数据,但是topic是抽象的概念,具体组织数据的Partition,它是物理的文件,topic中的数据会具体落在各个Partition中,一个Partition的数据又有多个segment组成,segment也是抽象的,segment中包含了log和index文件,这才是kafka具体存储数据的文件。

02、kafka为什么能实现低延迟高吞吐

kafka通过如下的技术实现它的低延迟高吞吐

  • Zero Copy(零拷贝) 技术

    • kafka的零拷贝技术在代码层面是调用Java的NIO包下的FileChannel实现,其中的transferTo()方式是具体实现零拷贝方法。

    零拷贝的具体实现需要操作系统和硬件的支持,在Linux中上述的transferTo方法最终会调用到底层的sendfile方法实现,如下图sendfile方法只需要进行2次“上下文切换”和2次的DMA数据拷贝即可完成数据的读写操作(对应kafka的数据生产和消费)(DMA:它是一种无须CPU参与就能直接把内存数据和外设数据进行交换的设备,是CPU读写大批量数据的一种替代设备)

    在这里插入图片描述

  • Page Cache(页缓存)+ 磁盘顺序读写

    • 当数据写入磁盘的时,数据会被先写入Page Cache,一般操作系统是按照4kb划分一个Page,根据一定机制,再把一批Page刷到磁盘中,这样就会有一批生产者产生的数据其实还是在操作系统内存中的,此时如果consumer在拉取数据,直接从Page Cache中就能拿到,如果生产者和消费者的速率差不多的情况下,kafka相当于是基于内存在读写数据
    • 而且kafka在flush到磁盘的时候,数据是按照磁盘顺序读写,这样也大大提升了刷写的速度。
  • 分区分段 + 索引

    • kafka中通过Partition把topic中的数据分成若干份放入broker中,在Partition中数据其实是按照一个个小的segment存储的,这也非常符合很多分布式系统的分区分桶的思路。
    • 与此同时,kafka也给一个个segment建立了稀疏索引文件,也就是哪些xxxx.index和xxxx.timestapindex文件
  • 批量读写

    • 同时kafka在读写的时候也都是按照批操作的,这样相对于单条处理来说减少了不必要的额外传输开销
  • 批量压缩

    • 压缩可以通过减少message的体积,使数据在网络传输时得到很大优化

03、kafka中如何实现CAP原则

CAP 原则是指在一个分布式系统中,对于,一致性,可用性和分区容忍性,是不能同时满足的,总的来说kafka不是严格的只实现CAP原则中的某两个放弃其中一个,它是一种动态的平衡

  • kafka通过多副本的ISR机制实现分区容忍性
    • kafka对于每个topic会提供多个一模一样的副本,然后在这些副本中选出一个leader来对外提供读写服务。其中这些正常的副本会在一个ISR的集合中,如果其中一个副本挂掉就会被踢出ISR,但是服务正常可用,如果是leader挂掉,此次会根据配置让ISR中的副本选举出新的leader对外提供服务,这里就牺牲了系统的可用性
  • kafka通过高水位机制实现数据的一致性
    • kafka通过牺牲follow副本的可用性,只允许leader副本对外提供读写服务来提高数据的一致性,这在一致性的实现上简单很多。
    • 具体来说kafka是通过只对外提供高水位以下的数据访问,从而实现各个副本之间数据的最终一致性。

    在版本的kafka中,高水位机制会出现丢数据和数据不一致的情况,在高版本中通过epoch机制修复了这样的问题。

  • kafka对于可用性来说没有做到那么严格,比如leader副本所在的机器有问题,对应的topic短暂不可用一直要到新的leader选举成功才行

04、数据不丢失的具体实现

  • broker端:
    • 通过配置不能让落后太多的副本参加leader的选举(unclean.leader.election.enable = false)
    • 开启配置多个副本(replication.factor > 1)
  • producer端:
    • ack设置为-1或是all(pro.put(ProducerConfig.ACKS_CONFIG,“all”))
    • send方法中一定要用带返回值的,如果失败了可以及时的得到通知或是做出相应的策略
  • consumer端
    • offset的提交设置为手动提交

05、kafka中的消费者组及相关问题

kafka的consumer在消费topic数据的时候是通过group的方式消费的
group中还有一个rebalance的过程,它是为了更好的把消费者分配到分区中消费数据存在的,rebalance机制运行起来的时候,所有的消费者都会暂停工作 ,对系统有比较大的影响

  • group的作用
    • 隔离不同group中消费者的互相影响,实现kafka消息的订阅模式
  • group中消费数据特点
    • 一个Partition只能让同一个group中的一个消费者来消费(为了保证分区中数据的顺序性),一般情况下一个分区分配一个消费者去消费即可,也会出现一个消费者同时消费多个分区的情况
  • group的中consumer的分配和管理
    • 它是通过rebalance机制来分配和管理,rebalance机制会把group中的每个消费者分配到对应的topic的Partition中进行消费,如果其中一个消费者挂了,它会从新分配一个新的过来消费,有新的消费者加入会给它分配对应的分区消费
  • rebalance机制的问题
    • 在rebalance机制运行的过程中,group中的所有消费者都会停下来不消费参加rebalance,这就会给系统带来一定时间的停摆
  • rebalance机制产生的条件和应对
    • group中consumer数量发生变化时,订阅的topic发生变化时,订阅的topic的Partition发生变化时,这三种情况下都会触发rebalance机制
    • rebalance机制如果不是频繁发生的话是一种正常现象,
  • 非正常情况下减少rebalance触发
    • 例如,consumer没有及时发送心跳请求导致误以为对应的consumer挂掉,还有consumer处理数据时间过长导致被踢出group,这些都是非正常情况
    • 可以根据自己业务运行时间调整调大,heartbeat.intgerval.ms,session.timeout.ms,max.poll.interval.ms等参数的数值

06、kafka集群的调优

  • broker端集群优化
    • 设置num.replica.fetcher参数与CPU核数一致,提供副本同步的效率
    • 调大replica.fetch.min.bytes里避免小批量数据的同步,提供吞吐量
    • 调大replica.fetch.max.byte在一批次中尽量多的同步数据,也是为了提高吞吐量
    • 指定broker端JVM的垃圾回收器为G1
  • producer端优化
    • 调大batch.size参数提供批次写入的量增大吞吐量,默认是16k
    • 调大buffer.memory参数,提高生产者端缓存的内存大小
    • retriest调大重试次数避免网络抖动带来的问题
    • 根据业务的需求调整ack的值
  • consumer端优化
    • 根据具体业务调整max.poll.records的大小
    • max.poll.interval.ms调整批次拉取之间的最大延迟,避免不必要的rebalance
    • heartbeat.interval.ms调整消费者和kafka之间的心跳超时时间,一般调整为session.timeout.ms的三分之一,避免不必要的rebalance

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

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

相关文章

【ArcGIS微课1000例】0137:色彩映射表转为RGB全彩模式

本文讲述ArcGIS中,将tif格式的影像数据从色彩映射表转为RGB全彩模式。 参考阅读:【GlobalMapper精品教程】093:将tif影像色彩映射表(调色板)转为RGB全彩模式 文章目录 一、色彩映射表预览二、色彩映射表转为RGB全彩模式一、色彩映射表预览 加载配套数据包中的0137.rar中的…

Python教程丨Python环境搭建 (含IDE安装)——保姆级教程!

工欲善其事,必先利其器。 学习Python的第一步不要再加收藏夹了!提高执行力,先给自己装好Python。 1. Python 下载 1.1. 下载安装包 既然要下载Python,我们直接进入python官网下载即可 Python 官网:Welcome to Pyt…

2025.1.13运算符重载和继承

作业 #include <iostream> #include <cstring> using namespace std; //在之前做的mystring类的基础上&#xff0c;将能够重载的运算符全部进行重载class mystring { private:char *str;int size;public://无参构造mystring():size(10){str new char[size];str[0…

慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(二)

3.UI模板 当我们选择一条已经建好的业务对象点击功能按钮【UI模板】进入该业务对象的UI显示配置界面。 右边填写的是UI模板的编码以及对应名称&#xff1b;菜单界面配置以业务对象UI模板编码获取显示界面。 3.1【列表-按钮】 展示的对应业务对象界面的功能按钮配置&#xff1…

springboot使用Easy Excel导出列表数据为Excel

springboot使用Easy Excel导出列表数据为Excel Easy Excel官网&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write 主要记录一下引入时候的pom&#xff0c;直接引入会依赖冲突 解决方法&#xff1a; <!-- 引入Easy Excel的依赖 -->&l…

计算机的错误计算(二百一十)

摘要 利用两个大模型计算 . 若可能&#xff0c;保留10位有效数字。实验表明&#xff0c;一个大模型给出了错误结果。另外一个大模型提供了 Python代码&#xff1b;运行代码后&#xff0c;输出中有2位错误数字。 例1. 计算 . 若可能&#xff0c;保留10位有效数字。 下面是一…

用vscode+ollama自定义Cursor AI编辑的效果

在vscode上搜索Continue 添加大语言模型 选择对应的本地模型版本 效果

基于微信小程序的汽车销售系统的设计与实现springboot+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

ANSYS Fluent学习笔记(七)求解器四部分

16.亚松弛因子 Controls面板里面设置&#xff0c;它能够稳定计算的过程。如果采用常规的迭代算法可能结果就会发生振荡的情况。采用亚松驰因子可以有助于残差的稳定。 他的取值范围是0-1&#xff0c;0代表没有亚松驰&#xff0c;1表示物理量变化很快&#xff0c;一般情况下取…

【MySQL数据库】基础总结

目录 前言 一、概述 二、 SQL 1. SQL通用语法 2. SQL分类 3. DDL 3.1 数据库操作 3.2 表操作 4. DML 5. DQL 5.1 基础查询 5.2 条件查询 5.3 聚合函数 5.4 分组查询 5.5 排序查询 5.6 分页查询 6. DCL 6.1 管理用户 6.2 权限控制 三、数据类型 1. 数值类…

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …

mysql中创建计算字段

目录 1、计算字段 2、拼接字段 3、去除空格和使用别名 &#xff08;1&#xff09;去除空格 &#xff08;2&#xff09;使用别名&#xff1a;AS 4、执行算术计算 5、小结 博主用的是mysql8 DBMS&#xff0c;附上示例资料&#xff1a; 百度网盘链接: https://pan.baidu.co…

uniapp 之 uni-forms校验提示【提交的字段[‘xxx‘]在数据库中并不存在】解决方案

目录 场景问题代码结果问题剖析解决方案 场景 uni-forms官方组件地址 使用uniapp官方提供的组件&#xff0c;某个表单需求&#xff0c;单位性质字段如果是高校&#xff0c;那么工作单位则是高校的下拉选择格式&#xff0c;单位性质如果是其他的类型&#xff0c;工作单位则是手动…

【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统

文章目录 参考资料云盘资料软硬件环境手机解锁刷机驱动绑定账号和设备解锁手机 Mindows工具箱安装工具箱和修复下载下载安卓和woa资源包第三方Recovery 一键安装Windows准备工作创建分区安装系统 效果展示Windows和Android一键互换Win切换安卓安卓切换Win 删除分区 参考资料 解…

苹果电脑怎么清理后台,提升苹果电脑运行速度

苹果电脑以其流畅的系统和高效的性能备受用户青睐&#xff0c;但即使是性能强大的Mac&#xff0c;随着使用时间的增长&#xff0c;也会遇到运行变慢、卡顿的问题。造成这种现象的一个主要原因是后台运行的程序和进程过多&#xff0c;占用了系统资源。那么&#xff0c;苹果电脑怎…

qt 快捷功能 快速生成 setter getter 构造函数 父类虚函数重写 成员函数实现 代码框架 查看父类及父类中的虚函数

qt 快速生成 setter getter 构造函数 父类虚函数重写 成员函数实现 代码框架 1、找到要实现的头文件 2、鼠标移动到在头文件中的类定义的类名上&#xff0c;右键进行选择。 这是插入父类虚函数(父类虚函数重写) 选项弹出来的结果。可以查看到所有父类及父类中的所有的虚函数

2_CSS3 背景 --[CSS3 进阶之路]

CSS3 中的背景属性提供了许多强大的功能来增强网页设计&#xff0c;包括但不限于多背景图像、渐变、背景大小控制等。以下是一些关键的 CSS3 背景属性及其用法示例。 1. 多重背景图像 CSS3 允许你为一个元素设置多个背景图像。这些图像按照它们在 background-image 属性中定义…

C++ ——— 内部类

目录 内部类的概念 内部类的特征 sizeof(外部类) 的大小 内部类的实例化 内部类就是外部类的友元 内部类的概念 如果一个类定义在另一个类的内部&#xff0c;这个内部类就叫做内部类&#xff0c;内部类是一个独立的类&#xff0c;它不属于外部类&#xff0c;更不能通过外…

03_Redis基本操作

1.Redis查询命令 1.1 官网命查询命令 为了便于学习Redis,官方将其用于操作不同数据类型的命令进行了分类整理。你可以通过访问Redis官方网站上的命令参考页面https://redis.io/commands来查阅这些分组的命令,这有助于更系统地理解和使用Redis的各项功能。 1.2 HELP查询命令…

深度解读微软Speech服务:让语音识别走进现实

大家好&#xff0c;今天我们来探讨一个激动人心的技术话题&#xff1a;微软的语音识别服务如何为我们提供强大的语音识别解决方案&#xff0c;特别是在电话录音中识别出不同的说话人。 场景描绘 想象一下&#xff0c;你有一段电话录音&#xff0c;并需要将其中的多个说话人区分…