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

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

相关文章:

01、kafka知识点综合

kafka是一个优秀大吞吐消息队列,下面我就从实用的角度来讲讲kafka中,“kafka为何有大吞吐的机制”,“数据不丢失问题”,“精准一次消费问题” 01、kafka的架构组织和运行原理 kafka集群各个节点的名称叫broker,因为kaf…...

怎么用python写个唤醒睡眠电脑的脚本?

环境: win10 python3.12 问题描述: 怎么用python写个唤醒睡眠电脑的脚本? 解决方案: 1.唤醒处于睡眠状态的电脑通常不是通过编程直接实现的,而是依赖于硬件和操作系统提供的特性。对于Windows系统,可…...

【Linux】Linux开发:GDB调试器与Git版本控制工具指南

Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建 在 Linux 开发中,GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题,G…...

Git 的引用规格(refspec)语法

目录 引用规格语法格式常见用法强制 -f 和 的区别git fetch origin remote-branch:local-branch 和 git push origin local-branch:remote-branch 区别 引用规格语法格式 格式如下&#xff1a;[]<src>:<dst> 常见用法 # fetch git fetch origin <remote-bra…...

反转链表题目

文章目录 反转链表题目链接&#xff1a;[在线OJ](https://leetcode.cn/problems/reverse-linked-list/description/)题目详解思路1&#xff1a;思路1算法复杂度 思路2代码实现思路2算法复杂度 结语 欢迎大家来到我的博客&#xff0c;给生活来点impetus 让我们进入《题海探骊》…...

LED灯按键调光芯片、PWM调光IC、发光灯控制调光芯片

按键调光芯片&#xff0c;特别是LED灯使用PWM调光的芯片IC&#xff0c;是一种用于控制LED灯具亮度的集成电路&#xff0c;常用于台灯、壁灯、吊灯等照明设备中。这种芯片通过脉冲宽度调制&#xff08;PWM&#xff09;技术来调节LED的亮度&#xff0c;可以实现从最亮到最暗的平滑…...

Android Room 报错:too many SQL variables (code 1 SQLITE_ERROR) 原因及解决方法

报错信息&#xff1a; android.database.sqlite.SQLiteException: too many SQL variables (code 1 SQLITE_ERROR): while compiling: SELECT * FROM points WHERE id IN (?,?,?,...,?,?,?)SQLiteException: too many SQL variables 通常是由于一次查询或插入的 SQL 语句…...

USA-Entrepreneur-20240708-Business/Unusual

How to Get More Attention You can’t run a great business if you can’t capture people’s attention, says Gary Vaynerchuk. “如果你无法吸引人们的注意力&#xff0c;你就不能经营一家伟大的企业。”——Gary VaynerchukGary Vaynerchuk是一位知名的企业家、作家和公…...

AI算法在目标锁定跟踪领域的利与弊!

AI目标锁定与制导的优点 提高精度和效率&#xff1a; AI算法能够快速准确地分析大量数据&#xff0c;从而改进目标识别和跟踪&#xff0c;提高打击或投放的准确性和效率。 通过深度学习模型&#xff0c;AI可以识别图像中的特征并判断是否存在目标&#xff0c;进一步提取目标…...

移远BC28_opencpu方案_pin脚分配

先上图&#xff0c;BC28模块的pin脚如图所示&#xff1a; 下面看看GPIO的复用管脚 然后我自己整理了一份完整的pin功能列表...

初学stm32 --- II2C_AT24C02,向EEPROM中读写数据

目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK&#xff08;Acknowledge&#xff09; 2. NACK&#xff08;Not Acknowledge&#xff09; IO口模拟II2C协议 发送起始信号&#xff1a; 发送停止信号&#xff1a; 检测应答信号&#xff1a; 发送应答信号&#x…...

动态规划汇总1

1.动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c…...

【计算机网络】lab5 ARP协议

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...

分布式缓存redis

分布式缓存redis 1 redis单机&#xff08;单节点&#xff09;部署缺点 &#xff08;1&#xff09;数据丢失问题&#xff1a;redis是内存存储&#xff0c;服务重启可能会丢失数据 &#xff08;2&#xff09;并发能力问题&#xff1a;redis单节点&#xff08;单机&#xff09;部…...

【Rust】数据类型

目录 思维导图 1. 数据类型概述 1.1 标量类型 1.1.1 整数类型 1.1.2 浮点数类型 1.1.3 布尔类型 1.1.4 字符类型 1.2 复合类型 1.2.1 元组类型 1.2.2 数组类型 2. 类型注解与类型推断 3. 整数溢出处理 4. 数字运算 5. 示例 思维导图 1. 数据类型概述 Rust是一种静…...

在现代工业自动化领域CClinkIE转ModbusTCP网关的应用

在现代工业自动化领域&#xff0c;开疆智能CCLINKIE转ModbusTCP网关扮演着至关重要的角色&#xff0c;尤其是在立体仓库的应用中。立体仓库系统通过高度集成的自动化设备和先进的信息技术&#xff0c;实现了物料存储和管理的高效率。CCLINKIE转ModbusTCP网关作为连接不同工业通…...

ASP.NET Core与GraphQL集成

一、引言&#xff1a;探索 C# 与ASP.NET Core、GraphQL 的协同魅力 在当今数字化浪潮中&#xff0c;Web 开发领域不断演进&#xff0c;新技术层出不穷。C# 作为.NET 平台上的中流砥柱&#xff0c;凭借其强大的功能与优雅的语法&#xff0c;成为众多开发者构建各类应用程序的得…...

Zabbix 从入门到精通

一、Zabbix 简介 1.1 什么是 Zabbix Zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案。它能监控各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位 / 解决存在的各种问题。 1…...

文生图模型的技术原理、训练方案与微调方案

文生图模型的技术原理、训练方案与微调方案 引言 文生图(Text-to-Image)模型是一类能够根据文本描述生成对应图像的深度学习模型。近年来,随着生成对抗网络(GANs)和扩散模型(Diffusion Models)等技术的进步,文生图模型在图像生成领域取得了显著的进展。本文将详细介绍…...

3_CSS3 渐变 --[CSS3 进阶之路]

CSS3 引入了渐变&#xff08;gradients&#xff09;&#xff0c;它允许在两个或多个指定的颜色之间显示平滑的过渡。CSS3 支持两种类型的渐变&#xff1a; 线性渐变&#xff08;Linear Gradients&#xff09;&#xff1a;颜色沿着一条线性路径变化&#xff0c;可以是水平、垂直…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

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

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

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...