【MQ】探索 Kafka

高性能

  • 消息的顺序性、顺序写磁盘

  • 零拷贝

    • RocketMQ内部主要是使用基于mmap实现的零拷贝,用来读写文件

    • 减少cpu的拷贝次数和上下文切换次数,实现文件的高效读写操作

  • Kafka

零拷贝

  • Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo

顺序写磁盘

  • Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件,基本减少了磁盘寻道和旋转的次数
    • 完成一次磁盘 IO,需要经过寻道、旋转和数据传输三个步骤,如果在写磁盘的时候省去寻道、旋转可以极大地提高磁盘读写的性能。
    • Kafka 中每个分区是一个有序的,不可变的消息序列,新的消息不断追加到 Partition 的末尾,在 Kafka 中 Partition 只是一个逻辑概念,Kafka 将 Partition 划分为多个 Segment,每个 Segment 对应一个物理文件,Kafka 对 segment 文件追加写,这就是顺序写文件

页缓存技术

  • 应当使用本地磁盘作为存储介质。Page Cache 的存在就可以提升消息的读取速度,

批量传输与压缩消息

  • 生产端有两个重要的参数:batch.size和linger.ms。这两个参数就和 Producer 的批量发送消息有关。

网络模型

  • Kafka 自己实现了网络模型做 RPC。底层基于 Java NIO,采用和 Netty 一样的 Reactor 线程模型。
    • Kafka 即基于 Reactor 模型实现了多路复用和处理线程池。
    • Reactor 模型基于池化思想,避免为每个连接创建线程,连接完成后将业务处理交给线程池处理;基于 IO 复用模型,多个连接共用同一个阻塞对象,不用等待所有的连接。遍历到有新数据可以处理时,操作系统会通知程序,线程跳出阻塞状态,进行业务逻辑处理

分区并发

  • Kafka 的 Topic 可以分成多个 Partition,每个 Paritition 类似于一个队列,保证数据有序。同一个 Group 下的不同 Consumer 并发消费 Paritition,分区实际上是调优 Kafka 并行度的最小单元,因此,可以说,每增加一个 Paritition 就增加了一个消费并发。

高效的文件数据结构

  • 每个 Topic 又可以分为一个或多个分区。每个分区各自存在一个记录消息数据的日志文件。Kafka 每个分区日志在物理上实际按大小被分成多个 Segment。
    • segment file 组成:由 2 大部分组成,分别为 index file 和 data file,此 2 个文件一一对应,成对出现,
    • index 采用稀疏索引,这样每个 index 文件大小有限,Kafka 采用mmap的方式,直接将 index 文件映射到内存,这样对 index 的操作就不需要操作磁盘 IO
    • 分段和索引的策略:利用偏移量和时间索引文件实现快速消息查找

高可用

  • Kafka

    • Kafka 从 0.8 版本开始提供了高可用机制,可保障一个或多个 Broker 宕机后,其他 Broker 能继续提供服务

分区副本、备份机制

    同一个 Partition 存在多个消息副本,每个 Partition 的副本通常由 1 个 Leader 及 0 个以上的 Follower 组成,

    • Kafka 会尽量将所有的 Partition 以及各 Partition 的副本均匀地分配到整个集群的各个 Broker 上
    • 多副本机制
      • 分区(Partition)引入了多副本(Replica)机制。
      • 多分区、多副本机制好处呢?
        • 1. Kafka 通过给特定 Topic 指定多个 Partition分区, 而各个 Partition 可以分布在不同的 Broker 上, 这样便能提供比较好的并发能力(负载均衡)。
        • 2. Partition 可以指定对应的 Replica 数, 这也极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。

    ACK 机制

          • 生产者发送消息中包含 acks 字段,该字段代表 Leader 应答生产者前 Leader 收到的应答数
          • 「acks=0」
            • 生产者无需等待服务端的任何确认,因此 acks=0 不能保证服务端已收到消息
          • 「acks=1」默认值
            • 只要 Partition Leader 接收到消息而且写入本地磁盘了,就认为成功了,不管其他的 Follower 有没有同步
          • 「acks=all or -1」
            • 服务端会等所有的 follower 的副本受到数据后才会收到 leader 发出的 ack,这样数据不会丢失
            • Broker 有个配置项min.insync.replicas(默认值为 1)代表了正常写入生产者数据所需要的最少 ISR 个数
        • 发送的 acks=1 和 0 消息会出现丢失情况,为了不丢失消息可配置生产者acks=all & min.insync.replicas >= 2

    ISR 机制

          • ISR 中的副本都是与 Leader 同步的副本,不在 ISR 中的Follower副本就被认为是没有资格的
          • Follower 周期性地向 Leader 发送 FetchRequest 请求,发送时间间隔配置在replica.fetch.wait.max.ms中,默认值为 500
          • 每个分区的 Leader 负责维护 ISR 列表并将 ISR 的变更同步至 ZooKeeper,被移出 ISR 的 Follower 会继续向 Leader 发 FetchRequest 请求,试图再次跟上 Leader 重新进入 ISR
          • ISR 中所有副本都跟上了 Leader,通常只有 ISR 里的成员才可能被选为 Leader

    主从同步

          • 1、Follower副本通过发送Fetch请求来同步Leader副本上的数据。
          • LEO(Log End Offset)
            • 对于Leader副本和每个Follower副本来说,它们都有各自的LEO
            • LEO是下一个要写入的消息的偏移量
          • HW(High Watermark)
            • HW是分区中所有副本的已提交消息的最大偏移量。是分区中所有ISR(In-Sync Replicas)副本的LEO中的最小值
            • 只要分区的Leader副本和至少一个Follower副本保持同步,消费者就能看到所有已提交的消息,即使Leader副本发生故障
          • 确保了Kafka在分区的Leader副本发生故障时,可以从ISR中选举出一个Follower副本作为新的Leader,
        • Unclean 领导者选举
          • 当 Kafka 中unclean.leader.election.enable配置为 true(默认值为 false)且 ISR 中所有副本均宕机的情况下,
          • 开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性,

    Leader 选举 & 故障恢复机制

          • 「Kafka 从 0.8 版本开始引入了一套 Leader 选举及失败恢复机制」
          • 在集群所有 Broker 中选出一个 Controller,负责各 Partition 的 Leader 选举以及 Replica 的重新分配
          • Controller
            • 集群中的 Controller 也会出现故障,因此 Kafka 让所有 Broker 都在 ZooKeeper 的 Controller 节点上注册一个 Watcher。
          • 当出现 Leader 故障后,Controller 会将 Leader/Follower 的变动通知到需要为此作出响应的 Broker。
          • Kafka 使用 ZooKeeper 存储 Broker、Topic 等状态数据,Kafka 集群中的 Controller 和 Broker 会在 ZooKeeper 指定节点上注册 Watcher(事件监听器),以便在特定事件触发时,由 ZooKeeper 将事件通知到对应 Broker
          • 当 Broker 发生故障后,由 Controller 负责选举受影响 Partition 的新 Leader 并通知到相关 Broker

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

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    VMware 和本机(Win10)安装共享文件

    1. 安装VM-tools, sudo apt-get install open-vm-tools-desktop -y 2. VMware->设置-> 选项中启动共享文件夹. 3. 本机设置共享文件夹(文件目录为data),右键属性设置: VMware, Other Locations->Computer->mnt->data 即可。 ps: 还有个…

    2025美赛MCM数学建模A题:《石头台阶的“记忆”:如何用数学揭开历史的足迹》(全网最全思路+模型)

    ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ 《石头台阶的“记忆”:如何用数学揭开历史的足迹》 目录 《石头台阶的“记忆”:如何用数学揭开历史的足迹》 ✨摘要✨ ✨引言✨ 1. 引言的结构 2. 撰写步骤 (1)研究背景 &#…

    SpringBoot-Vue整合百度地图

    文章目录 一、Spring Boot整合百度地图的步骤1. 申请百度地图的AK值2. 创建实体类3. 创建Controller层4. 前端集成百度地图4.1 在Vue项目中安装百度地图Vue组件库4.2 在Vue项目中引入百度地图API4.3 创建地图组件 二、实现功能说明1. 前端部分:2. 后端部分&#xff…

    Baklib如何优化企业知识管理实现全面数字化升级与协同创新

    内容概要 Baklib 作为企业知识管理的重要工具,提供了一个集成化的知识中台,帮助企业在数字化转型过程中更高效地管理和利用其知识资产。在现代企业中,知识的管理和应用显得尤为重要,因为优秀的知识管理能够直接影响到组织的决策效…

    机器学习day4

    自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测 import numpy as np import torch import torch.nn as nn import torch.optim as optimizer import matplotlib.pyplot as pltclass1_points np.array([[2.1, 1.8],[1.9, 2…

    天道无极:论文明兴衰中的规律自觉与文化觉醒

    宇宙洪荒,星河轮转,人类文明在浩渺时空中不过沧海一粟。当我们剖开青铜器上的饕餮纹,凝视量子计算机的硅基瞳孔,会发现所有文明兴衰的背后都跃动着同一组密码——对规律的认知与驾驭程度,构成了文明存续的底层逻辑。从两河流域的楔形文字到华尔街的电子屏幕,从雅典学院的…

    WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用

    WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用 一、前言二、Button 控件基础2.1 Button 的基本定义与显示2.2 按钮样式设置2.3 按钮大小与布局 三、Button 的交互功能3.1 点击事件处理3.2 鼠标悬停与离开效果3.3 按钮禁用与启用 四、TextBox 控件基础4.…

    解除阿里云盘压缩包分享限制的最新工具(2025年更新)

    前言 前段时间,为了在阿里云盘分享一些资料,尝试了好多种方法:改文件名后缀,打包自解压,使用将压缩文件追加在图片文件后,还有的一些工具,虽然能伪装文件但并不太好用,最后自己写了…

    HarmonyOS:创建应用静态快捷方式

    一、前言 静态快捷方式是一种在系统中创建的可以快速访问应用程序或特定功能的链接。它通常可以在长按应用图标,以图标和相应的文字出现在应用图标的上方,用户可以迅速启动对应应用程序的组件。使用快捷方式,可以提高效率,节省了查…

    21.0.2-为什么选FreeRTOS 第21章-FreeRTOS项目实战--基础知识之新建任务、启动流程、编码风格、系统配置

    这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 **V3:HAL库开发、手把手教学下面功能:PID速度控制、PID循迹、PID跟随、遥控、…

    12 款开源OCR发 PDF 识别框架

    2024 年 12 款开源文档解析框架的选型对比评测:PDF解析、OCR识别功能解读、应用场景分析及优缺点比较 这是该系列的第二篇文章,聚焦于智能文档处理(特别是 PDF 解析)。无论是在模型预训练的数据收集阶段,还是基于 RAG…

    深度剖析C++17中的std::optional:处理可能缺失值的利器

    文章目录 一、基本概念与设计理念二、构建与初始化(一)默认构造(二)值初始化(三)使用std::make_optional(四)使用std::nullopt 三、访问值(一)value()&#x…

    拟合损失函数

    文章目录 拟合损失函数一、线性拟合1.1 介绍1.2 代码可视化1.2.1 生成示例数据1.2.2 损失函数1.2.3 绘制三维图像1.2.4 绘制等高线1.2.5 损失函数关于斜率的函数 二、 多变量拟合2.1 介绍2.2 代码可视化2.2.1 生成示例数据2.2.2 损失函数2.2.3 绘制等高线 三、 多项式拟合3.1 介…

    基于微信小程序的移动学习平台的设计与实现(LW+源码+讲解)

    专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

    【公因数匹配——暴力、(质)因数分解、哈希】

    题目 暴力代码&#xff0c;Acwing 8/10&#xff0c;官网AC #include <bits/stdc.h> using namespace std; const int N 1e610; vector<int> nums[N]; int main() {ios::sync_with_stdio(0);cin.tie(0);int n;cin >> n;for(int i 1; i < n; i){int x;ci…

    操作系统指定用户密码永不过期

    背景 实际生产环境中&#xff0c;数据中心操作系统通常会有基线要求&#xff08;比如等保之类&#xff09;&#xff0c;要求设置操作系统密码有效期&#xff0c;但是infra团队或者操作系统管理员或者某些业务配置使用的操作系统用户又需要密码不能不停修改&#xff08;或者说一…

    能量提升法三:赞美

    前情回顾&#xff1a; 《能量提升法二&#xff1a;感恩》 片段&#xff1a;“感恩&#xff0c;就像是在跟世界说&#xff1a;谢谢你&#xff0c;我收到了&#xff0c;我很喜欢&#xff0c;请多来点” 把它归还人海&#xff0c;就当作每一个人&#xff0c;都有可能是曾经帮助…

    25美赛ABCDEF题详细建模过程+可视化图表+参考论文+写作模版+数据预处理

    详情见该链接&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 25美国大学生数学建模如何准备&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;-CSDN博客文章浏览阅读791次&#xff0c;点赞13次&#xff0c;收藏7次。通过了解比赛基本…

    2025企业繁体镜像站镜像站群版 | 干扰码+拼音插入

    技术背景 高效的SEO优化和内容采集是企业站群系统的核心竞争力。本文将详细介绍一套企业级网站镜像工具包&#xff0c;重点展示其在SEO优化、内容采集、智能处理等方面的创新实现。 系统特性 1. SEO优化功能 关键词智能布局标题标签优化链接结构优化移动端适配页面加速优化…

    动态规划<九>两个数组的dp

    目录 引例 LeetCode经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 引例 OJ传送门LeetCode<1143>最长公共子序列 画图分析&#xff1a; 使用动态规划解决 1.状态表示 ------经验题目要求 经验为选取第一个字符串的[0,i]区间以及第二个字…