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

【MQ】如何保证消息队列的高性能?

零拷贝

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
  • 分段和索引的策略:利用偏移量和时间索引文件实现快速消息查找
http://www.lryc.cn/news/527674.html

相关文章:

  • RAG是否被取代(缓存增强生成-CAG)吗?
  • 用C++编写一个2048的小游戏
  • 为何SAP S4系统中要设置MRP区域?MD04中可否同时显示工厂级、库存地点级的数据?
  • Windows10官方系统下载与安装保姆级教程【U盘-官方ISO直装】
  • 第05章 07 切片图等值线代码一则
  • 【深度学习】线性回归的简洁实现
  • 渗透测试技法之口令安全
  • 【R语言】数学运算
  • 小游戏源码开发搭建技术栈和服务器配置流程
  • 深度学习|表示学习|卷积神经网络|输出维度公式|15
  • cpp智能指针
  • 【面试题】 Java 三年工作经验(2025)
  • MOS的体二极管能通多大电流
  • Node.js下载安装及环境配置教程 (详细版)
  • 嵌入式MCU面试笔记2
  • 代码随想录算法【Day34】
  • 《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》重印P126、P131勘误
  • vim多文件操作如何同屏开多个文件
  • day6手机摄影社区,可以去苹果摄影社区学习拍摄技巧
  • 渗透测试之WAF规则触发绕过规则之规则库绕过方式
  • C语言【基础篇】之流程控制——掌握三大结构的奥秘
  • c++小知识点
  • 团体程序设计天梯赛-练习集——L1-022 奇偶分家
  • vue项目中,如何获取某一部分的宽高
  • LeetCode - #195 Swift 实现打印文件中的第十行
  • 机试题——最小矩阵宽度
  • 香港维尔利健康科技集团重金投资,内地多地体验中心同步启动
  • ZYNQ-IP-AXI-GPIO
  • Netty的心跳机制怎么实现的?
  • java基础——专题一 《面向对象之前需要掌握的知识》