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

【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

    相关文章:

    【MQ】探索 Kafka

    高性能 消息的顺序性、顺序写磁盘 零拷贝 RocketMQ内部主要是使用基于mmap实现的零拷贝,用来读写文件 减少cpu的拷贝次数和上下文切换次数,实现文件的高效读写操作 Kafka 零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Jav…...

    指针(C语言)从0到1掌握指针,为后续学习c++打下基础

    目录 一,指针 二,内存地址和指针 1,什么是内存地址 2,指针在不同系统下所占内存 三,指针的声明和初始化以及类型 1,指针的声明 2,指针 的初始化 1, 初始化方式优点及适用场景 4,指针的声明初始化类型…...

    项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(九)(完结篇)

    文章目录 一、成绩查询模块实现1、学生成绩查询功能实现1.1 页面设计1.2 前端页面实现1.3 后端功能实现2、成绩分段查询功能实现2.1 页面设计2.2 前端页面实现2.3 后端功能实现二、试卷练习模块实现三、我的分数模块实现1、 页面设计2、 前端页面实现3、 后端功能实现四、交流区…...

    AI DeepSeek-R1 Windos 10 环境搭建

    1、安装: 下载 Python |Python.org CUDA Drivers for MAC Archive | NVIDIA pip 和virtualenv Download Ollama on Windows 如下图 2、下载模型 deepseek-r1 ollama run deepseek-r1 或者可以ollama run deepseek-r1:8b 或 3、安装一个可视化对话Chatbox 下载 …...

    搜索与图论复习1

    1深度优先遍历DFS 2宽度优先遍历BFS 3树与图的存储 4树与图的深度优先遍历 5树与图的宽度优先遍历 6拓扑排序 1DFS&#xff1a; #include<bits/stdc.h> using namespace std; const int N10; int n; int path[N]; bool st[N]; void dfs(int u){if(nu){for(int i0;…...

    10.共享内存 信号量集 消息队列

    10.共享内存 信号量集 消息队列 **1. IPC对象操作通用框架****2. 共享内存&#xff08;Shared Memory&#xff09;****3. 信号量集&#xff08;Semaphore&#xff09;****4. 消息队列&#xff08;Message Queue&#xff09;****5. 练习与作业****6. 总结** 1. IPC对象操作通用框…...

    每日 Java 面试题分享【第 17 天】

    欢迎来到每日 Java 面试题分享栏目&#xff01; 订阅专栏&#xff0c;不错过每一天的练习 今日分享 3 道面试题目&#xff01; 评论区复述一遍印象更深刻噢~ 目录 问题一&#xff1a;Java 中的访问修饰符有哪些&#xff1f;问题二&#xff1a;Java 中静态方法和实例方法的区…...

    【懒删除堆】力扣2349. 设计数字容器系统

    设计一个数字容器系统&#xff0c;可以实现以下功能&#xff1a; 在系统中给定下标处 插入 或者 替换 一个数字。 返回 系统中给定数字的最小下标。 请你实现一个 NumberContainers 类&#xff1a; NumberContainers() 初始化数字容器系统。 void change(int index, int numb…...

    【Block总结】OutlookAttention注意力,捕捉细节和局部特征|即插即用

    论文信息 标题: VOLO: Vision Outlooker for Visual Recognition作者: Li Yuan, Qibin Hou, Zihang Jiang, Jiashi Feng, Shuicheng Yan代码链接: https://github.com/sail-sg/volo论文链接: https://arxiv.org/pdf/2106.13112 创新点 前景注意力机制: VOLO引入了一种称为“…...

    有效运作神经网络

    内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…...

    Vue 组件开发:构建高效可复用的前端界面要素

    1 引言 在现代 Web 开发中,构建高效且可复用的前端界面要素是提升开发效率和用户体验的关键。Vue.js 作为一种轻量级且功能强大的前端框架,提供了丰富的工具和机制,帮助开发者快速构建高质量的应用程序。通过合理设计和封装 Vue 组件,我们可以实现组件的高效复用,提高开发…...

    【Python】深入探索Python元类:动态生成类与对象的艺术

    《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 元类是Python中一个高级且强大的特性,允许开发者在类的创建过程中插入自定义逻辑,从而动态生成类和对象。本文将全面介绍Python中的元类概…...

    Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

    文章目录 Pre概述在编程中&#xff0c;外观模式是如何工作的&#xff1f;外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…...

    在Linux系统上安装.NET

    测试系统&#xff1a;openKylin(开放麒麟) 1.确定系统和架构信息&#xff1a; 打开终端&#xff08;Ctrl Alt T&#xff09;&#xff0c;输入cat /etc/os-release查看系统版本相关信息。 输入uname -m查看系统架构。确保你的系统和架构符合.NET 的要求&#xff0c;如果架构…...

    OpenAI Operator:AI Agent 大战的号角,从 “工具” 到 “助手” 的飞跃

    想尝试不同的 AI 模型&#xff1f;不必到处寻找&#xff01;chatTools 为您集成了 o1、GPT4o、Claude 和 Gemini 等多种选择&#xff0c;一个平台解决您的所有 AI 需求。现在就来体验吧&#xff01; 各位 AI 爱好者们&#xff0c;今天我们来聊聊 OpenAI 的最新力作——Operator…...

    AI大模型开发原理篇-9:GPT模型的概念和基本结构

    基本概念 生成式预训练模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型 是由 OpenAI 开发的基于 Transformer 架构的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;专门用于文本生成任务。它的设计理念在于通过大规模的预训练来学习语言模…...

    Java Swing 基础组件详解 [论文投稿-第四届智能系统、通信与计算机网络]

    大会官网&#xff1a;www.icisccn.net Java Swing 是一个功能强大的 GUI 工具包&#xff0c;提供了丰富的组件库用于构建跨平台的桌面应用程序。本文将详细讲解 Swing 的基础组件&#xff0c;包括其作用、使用方法以及示例代码&#xff0c;帮助你快速掌握 Swing 的核心知识。 一…...

    vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列

    最近在家过年闲的没事&#xff0c;于是研究起深度学习开发工具链的配置和安装&#xff0c;之前欲与天公试比高&#xff0c;尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境&#xff0c;最后惨败&#xff0c;沦为笑柄&#xff0c;痛定思痛&#xff0c;这次直接和…...

    【letta】The Letta Platform LETTA平台

    The Letta Platform LETTA平台 The Letta Platform LETTA平台开源网站2023年的论文 论文:MemGPT Towards LLMs as Operating Systems Letta enables developers to build and deploy stateful AI agents - agents that maintain memory and context across long-running conve…...

    想品客老师的第九天:原型和继承

    原型与继承前置看这里 原型 原型都了解了&#xff0c;但是不是所有对象都有对象原型 let obj1 {}console.log(obj1)let obj2 Object.create(null, {name: {value: 荷叶饭}})console.log(obj2) obj2为什么没有对象原型&#xff1f;obj2是完全的数据字典对象&#xff0c;没有…...

    Time Constant | RC、RL 和 RLC 电路中的时间常数

    注&#xff1a;本文为 “Time Constant” 相关文章合辑。 机翻&#xff0c;未校。 How To Find The Time Constant in RC and RL Circuits June 8, 2024 &#x1f4a1; Key learnings: 关键学习点&#xff1a; Time Constant Definition: The time constant (τ) is define…...

    原码、反码、补码以及lowbit运算

    原码、反码、补码以及lowbit运算 原码&#xff1a; 可以用来计算正数加减&#xff0c;正数的原码、反码、补码都一样。 第一位为符号位&#xff0c;符号位0为正数&#xff0c;1为负数(32位字符&#xff0c;这里用4位来举例子&#xff0c;后面皆是用4位来举例子&#xff0c;其…...

    芯片AI深度实战:实战篇之vim chat

    利用vim-ollama这个vim插件&#xff0c;可以在vim内和本地大模型聊天。 系列文章&#xff1a; 芯片AI深度实战&#xff1a;基础篇之Ollama-CSDN博客 芯片AI深度实战&#xff1a;基础篇之langchain-CSDN博客 芯片AI深度实战&#xff1a;实战篇之vim chat-CSDN博客 芯片AI深度…...

    当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)

    当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib) 当当网近30日热销书籍官网写在前面 实验目的:实现当当网近30日热销图书的数据采集与可视化分析。 电脑系统:Windows 使用软件:Visual Studio Code Python版本:python 3.12.4 技术需求:scrapy、…...

    Spring Boot 日志:项目的“行车记录仪”

    一、什么是Spring Boot日志 &#xff08;一&#xff09;日志引入 在正式介绍日志之前&#xff0c;我们先来看看上篇文章中&#xff08;Spring Boot 配置文件&#xff09;中的验证码功能的一个代码片段&#xff1a; 这是一段校验用户输入的验证码是否正确的后端代码&#xff0c…...

    幸运数字——蓝桥杯

    1.问题描述 哈沙德数是指在某个固定的进位制当中&#xff0c;可以被各位数字之和整除的正整数。例如 126126 是十进制下的一个哈沙德数&#xff0c;因为 (126)10mod(126)0&#xff1b;126 也是八进制下的哈沙德数&#xff0c;因为 (126)10(176)8&#xff0c;(126)10​mod(176)…...

    Deepseek本地部署(ollama+open-webui)

    ollama 首先是安装ollama&#xff0c;这个非常简单 https://ollama.com/ 下载安装即可 open-webui 这个是为了提供一个ui&#xff0c;毕竟我们也不想在cmd和模型交互&#xff0c;很不方便。 第一&#xff0c;需要安装python3.11&#xff0c;必须是3.11&#xff08;其他版…...

    【QT】 控件 -- 显示类

    &#x1f525; 目录 [TOC]( &#x1f525; 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 &#x1f525; 1. 前言 之前我在上一篇文章【QT】…...

    冲刺蓝桥杯之速通vector!!!!!

    文章目录 知识点创建增删查改 习题1习题2习题3习题4&#xff1a;习题5&#xff1a; 知识点 C的STL提供已经封装好的容器vector&#xff0c;也可叫做可变长的数组&#xff0c;vector底层就是自动扩容的顺序表&#xff0c;其中的增删查改已经封装好 创建 const int N30; vecto…...

    指针空值——nullptr(C++11)——提升指针安全性的利器

    C11引入的nullptr是对指针空值的正式支持&#xff0c;它提供了比传统NULL指针更加安全和明确的指针空值表示方式。在C语言中&#xff0c;指针操作是非常基础且常见的&#xff0c;而如何安全地处理指针空值&#xff0c;一直是开发者关注的重要问题。本文将详细讲解nullptr的引入…...