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

【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.kler.cn/a/524237.html

相关文章:

  • 【python】subprocess.Popen执行adb shell指令进入linux系统后连续使用指令,出现cmd窗口阻塞问题
  • AI编译器之——为什么大模型需要Relax?
  • 17.Word:李楠-学术期刊❗【29】
  • 剑指 Offer II 008. 和大于等于 target 的最短子数组
  • PostgreSQL 约束
  • 前端性能优化:HMR热更新和预获取加载
  • DeepSeek LLM解读
  • cursor ide配置远程ssh qt c++开发环境过程记录
  • [内网安全] 内网渗透 - 学习手册
  • Android OpenGL(七)实现滤镜效果(特效渲染)
  • 让Android adb支持互联网调试脱离局域网
  • window中80端口被占用问题
  • Json格式的字符串转换为Json格式
  • 街景全景图切分六面视图(含数据处理教程,可批量处理)
  • unordered_map和unordered_set的使用
  • 读量子霸权17模拟宇宙(下)
  • IPhone14 Pro MAX 设备详情
  • 【论文推荐|深度学习,滑坡检测,多光谱影像,自然灾害,遥感】2022年Landslide4Sense竞赛成果:基于多源卫星影像的先进滑坡检测算法研究(四)
  • git gui 笔记
  • Deepseek的api调用报错乱码问题
  • KNN算法学习实践
  • 过年之无用知识研究:std::is_assignable中的declval<_Dest>() = declval<_Src>()
  • Spring Boot 高级开发指南:全面掌握微服务架构的关键技术
  • Java中的反射机制:深入理解getConstructor(Class<?>... parameterTypes)方法
  • RocketMQ事务消息是如何实现的?
  • python爬虫验证下载的图片是否损坏方法